我有:
是否可以直接从 INPUT 存储桶读取文件 → 转码为另一种格式 → 保存到 OUTPUT 存储桶。
请让我知道手册、库、框架以及任何有助于理解如何做到这一点的东西。
至少 python 实现也很受欢迎。至少至少一些不同的语言还可以。
输入文件大小可能超过 10Gb,因此不希望将整个文件写入 RAM。一些基于 block 的方式是可取的。
输出格式多为
.mp4
, 但输入格式可能是 ts 视频或图像 ( jpg
, gif
等)看起来像 PHP-FFmpeg-video-streaming适合我的任务,但它只能用于网络流媒体格式。
最佳答案
好吧,我自己回答:
aws s3 cp s3://bucketA/input.jpg - | ffmpeg -y -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -f jpeg_pipe -loop 1 -i - -c:v 'libx264' -r 29.97 -t 30 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2,setsar=1" -c:a aac -shortest -movflags frag_keyframe+empty_moov -f mp4 /dev/stdout | aws s3 cp - s3://bucketB/output.mp4
解释:aws s3 cp s3://bucketA/input.jpg -
ffmpeg ... -f jpeg_pipe ... -i - ... -movflags frag_keyframe+empty_moov ... /dev/stdout
细节:2.1。
-f jpeg_pipe
输入格式必须为 pipe
类型。 ffmpeg 可以自动检测类型,所以不需要参数2.2.
-i -
从输入(管道)读取2.3.
-movflags frag_keyframe+empty_moov
还是不明白那是什么means ,但是没有这个参数就不能创建mp4。如果有人知道,请编辑这个地方。2.4.
/dev/stdout
将输出写入标准输出stdin
流到输出桶 aws s3 cp - s3://bucketB/output.mp4
但!我不喜欢这个解决方案。这里对情况的控制较少,我们无法引发/捕获异常。我想自己控制流。使用 PHP SDK S3 客户端看起来更聪明......所以我仍然开放供考虑。
关于PHP + FFMPEG + S3。直接在 S3 存储桶之间转码视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64889909/