【问题标题】:Naming convention to create/merge multiple video files创建/合并多个视频文件的命名约定
【发布时间】:2016-01-24 14:37:30
【问题描述】:

我正在尝试连接一些 .mp4 文件。我首先创建中间 .mpg 剪辑,然后使用“cat”命令将它们合并在一起;然后将其转换为 .mp4 文件

例如,

ffmpeg -i input1.mp4 -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.mp4 -qscale:v 1 intermediate2.mpg

// 现在将它们合并在一起

cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.mp4

现在,我想合并一个目录中的所有 .mpg 文件 如果我有最多 9 个 .mpg 文件,则以下命令有效

cat folder/*.mpg > intermediate_all.mpg

但是,如果我有超过 9 个 .mpg 文件,电影序列就会中断,这意味着没有。没有后出现10个剪辑。 1 个我不想要的剪辑。 ffmpeg 是否可以遵循任何命名约定。在 imagemagick 中,我可以轻松地使用以下语法并且它可以工作,但在 ffmpeg 中它不起作用。

cat folder/%d.mpg or cat folder/%d.mpg[0-10] 

【问题讨论】:

  • 我建议改用concat demuxer。您可以避免重新编码(取决于您的输入)。

标签: php ffmpeg


【解决方案1】:

当然。创建中间文件时,将数字填零,如下所示:

ffmpeg -i input1.mp4 -qscale:v 1 intermediate01.mpg
ffmpeg -i input2.mp4 -qscale:v 1 intermediate02.mpg

然后当您执行cat *.mpg 时,它会以正确的顺序提取它们。如果您使用循环来制作中间文件,请使用printf 对数字进行零填充,如下所示:

#!/bin/bash

    for i in {1..20}; do
        inname=input${i}.mp4 
        outname=$(printf "intermediate%03d.mpg" $i)
        echo Converting "$inname" to "$outname"
        ffmpeg -i "$inname" -qscale:v 1 "$outname"
   done

输出

Converting input1.mp4 to intermediate001.mpg
ffmpeg -i input1.mp4 -qscale:v 1 intermediate001.mpg
Converting input2.mp4 to intermediate002.mpg
ffmpeg -i input2.mp4 -qscale:v 1 intermediate002.mpg
Converting input3.mp4 to intermediate003.mpg
ffmpeg -i input3.mp4 -qscale:v 1 intermediate003.mpg
Converting input4.mp4 to intermediate004.mpg
ffmpeg -i input4.mp4 -qscale:v 1 intermediate004.mpg
Converting input5.mp4 to intermediate005.mpg
ffmpeg -i input5.mp4 -qscale:v 1 intermediate005.mpg
Converting input6.mp4 to intermediate006.mpg
ffmpeg -i input6.mp4 -qscale:v 1 intermediate006.mpg
Converting input7.mp4 to intermediate007.mpg
ffmpeg -i input7.mp4 -qscale:v 1 intermediate007.mpg
Converting input8.mp4 to intermediate008.mpg
ffmpeg -i input8.mp4 -qscale:v 1 intermediate008.mpg
Converting input9.mp4 to intermediate009.mpg
ffmpeg -i input9.mp4 -qscale:v 1 intermediate009.mpg
Converting input10.mp4 to intermediate010.mpg
ffmpeg -i input10.mp4 -qscale:v 1 intermediate010.mpg
Converting input11.mp4 to intermediate011.mpg
ffmpeg -i input11.mp4 -qscale:v 1 intermediate011.mpg
Converting input12.mp4 to intermediate012.mpg
ffmpeg -i input12.mp4 -qscale:v 1 intermediate012.mpg
Converting input13.mp4 to intermediate013.mpg
ffmpeg -i input13.mp4 -qscale:v 1 intermediate013.mpg
Converting input14.mp4 to intermediate014.mpg
ffmpeg -i input14.mp4 -qscale:v 1 intermediate014.mpg
Converting input15.mp4 to intermediate015.mpg
ffmpeg -i input15.mp4 -qscale:v 1 intermediate015.mpg
Converting input16.mp4 to intermediate016.mpg
ffmpeg -i input16.mp4 -qscale:v 1 intermediate016.mpg
Converting input17.mp4 to intermediate017.mpg
ffmpeg -i input17.mp4 -qscale:v 1 intermediate017.mpg
Converting input18.mp4 to intermediate018.mpg
ffmpeg -i input18.mp4 -qscale:v 1 intermediate018.mpg
Converting input19.mp4 to intermediate019.mpg
ffmpeg -i input19.mp4 -qscale:v 1 intermediate019.mpg
Converting input20.mp4 to intermediate020.mpg
ffmpeg -i input20.mp4 -qscale:v 1 intermediate020.mpg

【讨论】:

    【解决方案2】:

    这是我刚刚使用 PHP 作为脚本语言制作的解决方案。我们可以使用 PHP 的自然顺序算法。

    $line = '';
    $files = glob($location . "/*.mpg"); 
    natsort($files);
        foreach ($files as $filename) 
        {
            $line .= " " . $filename; 
        }
    
     $command = "cat $line > $location/intermediate_all.mpg";
     exec($command); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多