在 Lambda 和 S3 中使用 Ffmpeg 组合视频 代码演练我想问你的问题

问题描述

目标

我正在使用 AWS Lambda 制作视频转换工具,可以使用网页将视频上传到 S3 存储桶。当所有视频(1 个或更多)上传到存储桶时,将最后上传 done.json 文件。每次上传时都会调用 Lambda 函数,并且只有在上传最终的 done.json 时才会执行某些操作。

代码演练

done.json 上传后,它将获取当前文件夹中的所有视频,并使用 Ffmpeg 进行转换,如下所示:

 i = 0
 ts_video_paths = []
 for video in video_paths:
     video_ts = os.path.splitext(video)[0] + '.ts'
     s3_source_signed_url = s3_client.generate_presigned_url('get_object',Params={'Bucket': S3_SOURCE_BUCKET,'Key': video},ExpiresIn=SIGNED_URL_TIMEOUT)
                
     ts_video_paths.append(f'/tmp/{rnd}/ts_video{i}.ts')
     ffmpeg_ts_cmd = f'/opt/bin/ffmpeg -i {s3_source_signed_url} -c:v copy -copyts -bsf:v h264_mp4toannexb -f mpegts -flags -global_header -af aresample=async=1:first_pts=0 /tmp/{rnd}/ts_video{i}.ts'
     command = shlex.split(ffmpeg_ts_cmd)
     subprocess.run(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                
     i += 1

制作完所有 .ts 文件后,它们将合并为一个文件(看到某处可以添加 .ts 文件

 data = b''
 for video in ts_video_paths:
   f = open(video,'rb')
   data += f.read()
            
   f = open(f'/tmp/{rnd}/all.ts','wb')
   f.write(data)
   f.close()          

最后一步是将 all.ts 转换为 .mp4 视频。在这一步我有时不能出错。它只发生在某些视频中,我找不到解决方案。

ffmpeg_combine_cmd = f'/opt/bin/ffmpeg -i /tmp/{rnd}/all.ts -acodec copy -vcodec copy -f mp4 /tmp/{rnd}/video.mp4'
command_final = shlex.split(ffmpeg_combine_cmd)
p2 = subprocess.run(command_final,check=True)  # Sometimes gives an error videos 

我在转换视频时遇到的错误

Command '['/opt/bin/ffmpeg','-i','/tmp/CLZHC/all.ts','-acodec','copy','-vcodec','-f','mp4','/tmp/CLZHC/video.mp4']' returned non-zero exit status 1.

我想问你的问题

  • 这是解决这个问题的“正确”方式吗?
  • 有人知道我犯了什么错误吗?
  • 或者有人能给我一些建议吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)