1. 制作每个部分

1. 制作每个部分

我有一个 ts 文件列表,这些文件将被连接起来,稍后进行修剪并将其编码为 mp4。

一切正常……但是我现在遇到的问题是文件被重新编码了……这不是我想要的,因为 ts 已经是 h264 和 mp3,所以只需将其打包成 mp4 就可以了。实际上,这是可行的:

ffmpeg -i file.ts -c copy file.mp4

但事实并非如此:

ffmpeg -i videohls-1935m-index.ts -y -filter_complex \
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[0:v]trim=30:90,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:90,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=100:200,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=100:200,asetpts=PTS-STARTPTS[a2]; \
[0:v]trim=250:350,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=250:350,asetpts=PTS-STARTPTS[a3]; \
[v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[out] \
-map [out] \
-c copy \
videohls-1935m-index.mp4

显然它不会“复制”编解码器,因为输出来自映射到 [out] 的虚拟出口(或类似的东西......老实说,我不知道它究竟是如何工作的,但我知道是这样的),所以它没有“编解码器”...所以它无法复制它。

这意味着我有两个问题:

  1. 文件更小了,这并不坏,但是......
  2. 该文件被重新编码...因此质量也较低。

我该如何避免这种情况并保持视频质量?

答案1

过滤需要重新编码,但你还有另一种选择:

1. 制作每个部分

你可以做的是流复制每个段使用-ss-t-to-c copy

  • 跳过前 10 秒并进行 20 秒输出的示例:

    ffmpeg -ss 10 -i input -t 20 -c copy output
    
  • 示例跳过前 10 秒并在持续时间 30 时停止,从而产生 20 秒的输出:

    ffmpeg -i input -ss 10 -to 30 -c copy output
    

2. 连接

  1. 首先,阅读concat 解复用器文档

  2. 然后,创建一个列表文件:

    $ cat inputs.txt
    file '/path/to/segment00.mp4'
    file '/path/to/segment01.mp4'
    file '/path/to/segment02.mp4'
    file '/path/to/segment03.mp4'
    
  3. 最后,您可以连接:

    ffmpeg -f concat -i inputs.txt -c copy output
    

另请参阅

相关内容