PHP + FFMPEG + S3。直接在 S3 存储桶之间转码视频

标签 php amazon-s3 ffmpeg transcoding

我有:

  • S3 输入桶
  • S3 输出桶
  • PHP
  • ffmpeg

  • 是否可以直接从 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 - 
    
  • 从 stdin 读取输入流并再次将其流式传输到 stdout

  • 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/

    相关文章:

    php - 从与给定日期之前的日期关联的字段中找出总金额

    amazon-web-services - API Gateway GET/PUT 大文件到 S3

    audio - 使用 FFMPEG 淡出视频/音频

    PHP 将字符串矩阵转换为多维数组

    php - 在javascript函数中增加php变量

    Javascript 检查 PHP 变量是否已定义

    amazon-web-services - 如何在 "s3 sync"中包含空文件夹?

    csv - 敏感文件的 Amazon S3 存储

    flash - ffmpeg:简单的 RTMP 流

    batch-file - 从 for 循环中的变量中减去特定字符串