在ffmpeg中,使用带trim和atrim的filter_complex时,如何处理字幕流



我使用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滤波器图只能将字幕文本添加到视频中(例如subtitleass滤波器(。它没有办法操纵字幕流。

最好的选择是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。

免责声明:我没有亲自核实,但它应该在纸上有效。

最新更新