微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。