2017-01-24 37 views
1

我有一个MPEG文件,从电视直播录制,包括视频以及多种音频和字幕流。我的最终目标是能够创建一个较小的视频文件,因为mpeg文件的大小为几GB。我的这条道路上的第一步就是要能够选择每个视频,音频和字幕流之一,并将它们复制到一个MKV文件,丢弃我不感兴趣的流。(我选择MKV,因为它允许存储一个dvdsub字幕流其他容器格式将不会)在ffmpeg的,如何调整dvdsub字幕匹配视频大小,使用scale2ref过滤器?

我遇到的问题是,当我播放输出视频时,dvdsub字幕显示非常小,当我研究这个时我发现ffmpeg不会自动缩放字幕来匹配源视频:https://trac.ffmpeg.org/ticket/4744

我尝试过使用scale2ref过滤器,但我不明白文档,它们给出的示例对我来说没有意义(请参见下面的示例)。

我有选择三个流和副本1分钟至输出的命令,如下所示:

ffmpeg -ss 00:28:00.200 -i Hillary-2016-08-21.mpg -t 00:01:00.000 -map 0:0 -c:v copy -map 0:3 -c:a copy -map 0:6 -c:s dvdsub cut.mkv 

这里的输出:

Input #0, mpegts, from 'Hillary-2016-08-21.mpg': 
    Duration: 01:30:00.06, start: 20852.199389, bitrate: 6813 kb/s 
    Program 1 
    Stream #0:0[0xfa]: Video: h264 (Main) ([27][0][0][0]/0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc 
    Stream #0:1[0x12c](eng): Audio: aac_latm (HE-AAC) ([17][0][0][0]/0x0011), 48000 Hz, stereo, fltp 
    Stream #0:2[0x131](ita): Audio: aac_latm (HE-AAC) ([17][0][0][0]/0x0011), 48000 Hz, stereo, fltp (visual impaired) 
    Stream #0:3[0x191](eng): Audio: ac3 ([129][0][0][0]/0x0081), 48000 Hz, 5.1(side), fltp, 384 kb/s 
    Stream #0:4[0x3ea]: Unknown: none ([11][0][0][0]/0x000B) 
    Stream #0:5[0x3ec]: Unknown: none ([11][0][0][0]/0x000B) 
    Stream #0:6[0x3fc](eng): Subtitle: dvb_subtitle ([6][0][0][0]/0x0006) (hearing impaired) 
    Stream #0:7[0x1f40]: Unknown: none ([5][0][0][0]/0x0005) 
File 'cut.mkv' already exists. Overwrite ? [y/N] y 
Output #0, matroska, to 'cut.mkv': 
    Metadata: 
    encoder   : Lavf57.56.100 
    Stream #0:0: Video: h264 (Main) (H264/0x34363248), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 50 tbr, 1k tbn, 90k tbc 
    Stream #0:1(eng): Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, 5.1(side), 384 kb/s 
    Stream #0:2(eng): Subtitle: dvd_subtitle (dvdsub) (hearing impaired) 
    Metadata: 
     encoder   : Lavc57.64.101 dvdsub 
Stream mapping: 
    Stream #0:0 -> #0:0 (copy) 
    Stream #0:3 -> #0:1 (copy) 
    Stream #0:6 -> #0:2 (dvb_subtitle (dvbsub) -> dvd_subtitle (dvdsub)) 
Press [q] to stop, [?] for help 
frame= 2956 fps=0.0 q=-1.0 Lsize= 39612kB time=00:00:59.99 bitrate=5408.7kbits/s speed= 216x  
video:36702kB audio:2896kB subtitle:23kB other streams:0kB global headers:0kB muxing overhead: unknown 

scale2ref的文档给出了一个例子覆盖层,我不想覆盖任何东西,我只是想调整字幕流的大小。下面是他们的榜样:

'scale2ref[b][a];[a][b]overlay' 

我得到的最接近是这样的:

ffmpeg -ss 00:28:00.200 -i Hillary-2016-08-21.mpg -t 00:01:00.000 -map 0:0 -c:v copy -map 0:3 -c:a copy -filter_complex "[0:6]scale2ref[b]" -map "[b]" cut.mkv 

,输出是:

Input #0, mpegts, from 'Hillary-2016-08-21.mpg': 
    Duration: 01:30:00.06, start: 20852.199389, bitrate: 6813 kb/s 
    Program 1 
    Stream #0:0[0xfa]: Video: h264 (Main) ([27][0][0][0]/0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc 
    Stream #0:1[0x12c](eng): Audio: aac_latm (HE-AAC) ([17][0][0][0]/0x0011), 48000 Hz, stereo, fltp 
    Stream #0:2[0x131](ita): Audio: aac_latm (HE-AAC) ([17][0][0][0]/0x0011), 48000 Hz, stereo, fltp (visual impaired) 
    Stream #0:3[0x191](eng): Audio: ac3 ([129][0][0][0]/0x0081), 48000 Hz, 5.1(side), fltp, 384 kb/s 
    Stream #0:4[0x3ea]: Unknown: none ([11][0][0][0]/0x000B) 
    Stream #0:5[0x3ec]: Unknown: none ([11][0][0][0]/0x000B) 
    Stream #0:6[0x3fc](eng): Subtitle: dvb_subtitle ([6][0][0][0]/0x0006) (hearing impaired) 
    Stream #0:7[0x1f40]: Unknown: none ([5][0][0][0]/0x0005) 
Streamcopy requested for output stream 0:0, which is fed from a complex filtergraph. Filtering and streamcopy cannot be used together. 

而且我真的不明白我怎么可以使用过滤器并将我调整大小的字幕流引导到输出文件中。

任何帮助表示赞赏!谢谢!

回答

0

scale2ref标签都其作为视频流输出,这是他们几乎总是。因此ffm​​peg的正在申请的c:v值来缩放潜艇。

相反,你应该尝试

ffmpeg -ss 28:00.2 -canvas_size 1920x1080 -i Hillary-2016-08-21.mpg -t 1:00 -map 0:0 -c:v copy -map 0:3 -c:a copy -map 0:6 -c:s dvdsub cut.mkv 

使用

ffmpeg -ss 28:00.2 -i Hillary-2016-08-21.mpg -t 1:00 -filter_complex "[0:6][0:0]scale2ref[b][a]" -map 0:0 -c:v copy -map 0:3 -c:a copy -map "[b]" cut.mkv -map "[a]" -f null - 

scale2ref有两个输入端和吐两个输出。两端的第二个元素是ref erence视频。因此必须告诉ffmpeg如何处理该参考的传递副本。在上面的命令中,分配了空复用器,将其发送给遗忘。

+0

这是输出我得到:复制视频流请求输出流0:2,这是从复杂的进料FilterGraph动态。过滤和流式复制不能一起使用。 –

+0

哇。看起来像“-canvas_size”是我失踪的魔法。谢谢 !! –