首页 > 解决方案 > 将多个ffmpeg命令合并为一行,使整个过程更快

问题描述

我想将多个命令合并为一个,以便整个处理时间最快。到目前为止我正在做的是

  1. 视频文件从网络表单上传,然后服务器上传到临时目录。

     if (move_uploaded_file($_FILES[$param]['tmp_name'], $filePath)) {
    
    
           return $filePath;
         }
    
  2. 在视频周围添加黑色边框(通过 ffmpeg 命令) - 视频再次上传到目录

    $command_new = "ffmpeg -i $filePath -vf 'scale=720:1280:force_original_aspect_ratio=decrease,pad=720:1280:(ow-iw)/2:(oh-ih)/2,setsar=1' $video_file";
        exec($command_new);
    
  3. 优化视频(ffmpeg 命令) - 视频再次上传到目录

      $cmd_new = "ffmpeg -i $video_file -c:v libx264 -crf 28 $optimizeResultFile";
    
  4. 将上传的文件与数据库中现有的视频文件合并为一个并将该文件上传到目录中(通过 ffmpeg 命令)

           $command_new = "ffmpeg -i $optimizeResultFile   -i $second_video_path   -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]'   -map [vid]   -c:v libx264   -crf 23   -preset veryfast $videomerge";
    
  5. //在最终合并的视频中添加自定义声音

           $cmd_new = "ffmpeg -i $videomerge -i $audio -c:v copy -c:a aac -shortest -map 0:v:0 -map 1:a:0 $with_new_audio";
    

是否可以在一个命令中而不是在多个命令中完成所有操作。此过程需要 1 分钟才能上传最终文件。想让它更快

标签: unixvideoffmpeg

解决方案


ffmpeg -i $database -i $uploaded -i $audio -filter_complex "[1:v]scale=720:1280:force_original_aspect_ratio=decrease,pad=720:1280:-1:-1,setsar=1[right];[0:v][right]hstack,format=yuv420p[v]" -map "[v]" -map 2:a -c:v libx264 -crf 23 -preset veryfast -c:a copy -shortest -movflags +faststart output.mp4
  • 使用hstack 过滤器代替 pad + overlay。
  • 这假设$database与 的高度相同$uploaded
  • 这假设$audio是 AAC。否则,更改-c:a copy-c:a aac.

推荐阅读