我使用ffmpeg滤波器图来提取和连接视频块。作为一个简单的例子,考虑一下这个,它获取一个带有视频流和音频流的输入文件,并产生一个20秒的输出,其中包括输入的时间戳00:10-00:20和00:30-00:40:
ffmpeg -i in.mkv
-filter_complex "
[0:0]trim=start=10:end=20,setpts=PTS-STARTPTS[v1];
[0:1]atrim=start=10:end=20,asetpts=PTS-STARTPTS[a1];
[0:0]trim=start=30:end=40,setpts=PTS-STARTPTS[v2];
[0:1]atrim=start=30:end=40,asetpts=PTS-STARTPTS[a2];
[v1][a1][v2][a2]concat=n=2:v=1:a=1[v][a]
" -map [v] -map [a]
-c:0 libx264 -preset:0 ultrafast
-c:1 ac3 -b:1 128k -ac:1 2 out.mkv
有没有一种方法可以以类似的方式处理字幕流,使字幕与其他经过修剪的流相匹配?我正在寻找一些可以在命令行中工作的东西,作为非交互式批处理过程的一部分。
更新-解决方案
在@kesh的反馈下,我们使用concat
解复用器来处理字幕,并将其与将音频和视频流读取到复杂的滤波器图中相结合。首先,您需要一个concat输入文件,如:
file 'in.mkv'
inpoint 10
outpoint 20
file 'in.mkv'
inpoint 30
outpoint 40
然后,如果字幕是流5,例如,只是:
ffmpeg -i in.mkv
-f concat -i concat-file
-filter_complex "
[0:0]trim=start=10:end=20,setpts=PTS-STARTPTS[v1];
[0:1]atrim=start=10:end=20,asetpts=PTS-STARTPTS[a1];
[0:0]trim=start=30:end=40,setpts=PTS-STARTPTS[v2];
[0:1]atrim=start=30:end=40,asetpts=PTS-STARTPTS[a2];
[v1][a1][v2][a2]concat=n=2:v=1:a=1[v][a]
" -map [v] -map [a] -map 1:5
-c:0 libx264 -preset:0 ultrafast
-c:1 ac3 -b:1 128k -ac:1 2
-c:2 copy out.mkv
不,不能。FFmpeg滤波器图只能将字幕文本添加到视频中(例如subtitle
和ass
滤波器(。它没有办法操纵字幕流。
最好的选择是concat
解复用器。可以使用不同的开始时间和结束时间多次列出同一个文件。在批处理文件中,可以在内存中创建concat列表,并将其管道传输到FFMpeg中。
[编辑]
假设in.mkv
拥有所有内容:视频、音频和字幕流。然后您可以准备一个concat-demuxer文件,如:
listing.txt
ffconcat version 1.0
file in.mkv
inpoint 10
outpoint 20
file in.mkv
inpoint 30
outpoint 40
基本上,使用不同的开始和结束时间戳多次列出输入文件。
然后,
ffmpeg -f concat -i listing.txt -map [v] -map [a] -map [s] -c copy out.mkv
将所有3个流复制到CCD_ 7。
免责声明:我没有亲自核实,但它应该在纸上有效。