TimeAlbumTask.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import logging
  2. import os
  3. import subprocess
  4. from celery import shared_task
  5. from Ansjer.config import LOGGER
  6. import django
  7. # 设置 Django 的环境变量
  8. os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'Ansjer.local_config.local_settings') # 确保替换为实际的 settings 模块路径
  9. django.setup()
  10. @shared_task
  11. def generate_video(image_files, output_path):
  12. video_files = []
  13. music_path = "static/temp/music.mp3"
  14. # 定义特效列表
  15. transitions = [
  16. "BowTieHorizontal.glsl",
  17. "burn.glsl",
  18. "cube.glsl",
  19. "pinwheel.glsl",
  20. "windowslice.glsl",
  21. "Radial.glsl",
  22. "rotateTransition.glsl",
  23. "wind.glsl",
  24. "squeeze.glsl"
  25. ]
  26. # 生成相邻图片的视频
  27. for i in range(len(image_files) - 1):
  28. output_video = os.path.join(output_path, f'{i + 1}_{i + 2}.mp4')
  29. video_files.append(output_video)
  30. cmd = [
  31. 'ffmpeg', '-loop', '1', '-i', image_files[i],
  32. '-loop', '1', '-i', image_files[i + 1],
  33. '-filter_complex',
  34. f'gltransition=duration=1:offset=0.7:source=gl-transitions/{transitions[i]}',
  35. '-t', '2', output_video
  36. ]
  37. subprocess.run(cmd, check=True)
  38. # 生成拼接列表文件
  39. with open(os.path.join(output_path, 'filelist.txt'), 'w') as f:
  40. for video in video_files:
  41. f.write(f"file '{video}'\n")
  42. # 拼接视频
  43. final_output = os.path.join(output_path, 'final_output.mp4')
  44. subprocess.run(['ffmpeg', '-f', 'concat', '-safe', '0', '-i', 'filelist.txt', '-c', 'copy', final_output],
  45. check=True)
  46. # 添加背景音乐
  47. final_output_with_music = os.path.join(output_path, 'final_output_with_music.mp4')
  48. subprocess.run(['ffmpeg', '-i', final_output, '-i', music_path, '-c:v', 'copy', '-c:a', 'aac', '-b:a', '192k',
  49. '-shortest', final_output_with_music], check=True)
  50. # 清理临时文件
  51. for video in video_files:
  52. os.remove(video)
  53. os.remove('filelist.txt')