Решил попробовать использовать ffmpeg для кодирования видео вместо старого-доброго mencoder. Как и следовало ожидать, столкнулся с несколькими проблемами.
1. Как смуксить потоки в другом порядке?
На вход подаю mpeg-видео с 2 аудиодорожками внутри, встроенными субтитрами и 2 внешними файлами субтитров.
Код: Выделить всё
mifodix@linux-yusg:~> ffmpeg -i ashes_dump.mpg -i rus.srt -i ukr.srt
ffmpeg version 0.8.3, Copyright (c) 2000-2011 the FFmpeg developers
built on Sep 8 2011 19:02:07 with gcc 4.5.1 20101208 [gcc-4_5-branch revision 167585]
configuration: --shlibdir=/usr/lib64 --prefix=/usr --mandir=/usr/share/man --libdir=/usr/lib64 --enable-shared --disable-static --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libxvid --enable-postproc --enable-gpl --enable-x11grab --extra-cflags='-fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -fPIC -I/usr/include/gsm' --enable-debug --disable-stripping --enable-libgsm --enable-libschroedinger --enable-libdirac --enable-avfilter --enable-libvpx --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libdc1394 --enable-pthreads --enable-librtmp
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 7. 0 / 53. 7. 0
libavformat 53. 4. 0 / 53. 4. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 2. 0. 0 / 2. 0. 0
libpostproc 51. 2. 0 / 51. 2. 0
[mpeg @ 0x635660] max_analyze_duration 5000000 reached at 5005000
Input #0, mpeg, from 'ashes_dump.mpg':
Duration: 01:02:22.33, start: 0.280633, bitrate: 7745 kb/s
Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 32:27 DAR 16:9], 7000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0.1[0x80]: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
Stream #0.2[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Stream #0.3[0x21]: Subtitle: dvdsub
[srt @ 0x63d340] Estimating duration from bitrate, this may be inaccurate
Input #1, srt, from 'rus.srt':
Duration: N/A, start: 6.053000, bitrate: N/A
Stream #1.0: Subtitle: srt
[srt @ 0x6469c0] Estimating duration from bitrate, this may be inaccurate
Input #2, srt, from 'ukr.srt':
Duration: N/A, start: 5.252000, bitrate: N/A
Stream #2.0: Subtitle: srt
At least one output file must be specified
На выходе должен получится mkv с h264-видео, двумя аудиодорожками из исходного mpeg и 2 субтитрами из rus.srt и ukr.srt. С помощью ключа -map указываю какие дорожки/потоки нужно взять и откуда. Но вот в чём проблема: дорожки в выходном файле располагаются в порядке добавления их через ключ -map, т. е. в выходном файле дорожка с субтитрами встаёт между аудиодорожками:
Код: Выделить всё
mifodix@linux-yusg:~> ffmpeg -i ashes_dump.mpg -i rus.srt -i ukr.srt -map 0:0 -vlang ENG -vcodec libx264 -x264opts threads=auto:psnr=1:ssim=1:b_adapt=2:deblock:cabac=1:chroma_me=1:subq=9:partitions=all:8x8dct=1:me=umh:nofast_pskip=1:nodct_decimate=1:me_range=32:trellis=2:frameref=16:bframes=16:b_pyramid=normal:weight_b=1:mixed_refs=1:direct_pred=auto:keyint=750:keyint_min=25:aq_mode=1:aq_strength=1.0:psy_rd=1.0,0.0:bitrate=2000:pass=1 -map 0:1 -alang ENG -acodec copy -map 1.0 -slang RUS -scodec copy -y res.mkv -map 0.2 -alang ENG -acodec copy -newaudio -map 2:0 -slang UKR -scodec copy -newsubtitle
ffmpeg version 0.8.3, Copyright (c) 2000-2011 the FFmpeg developers
built on Sep 8 2011 19:02:07 with gcc 4.5.1 20101208 [gcc-4_5-branch revision 167585]
configuration: --shlibdir=/usr/lib64 --prefix=/usr --mandir=/usr/share/man --libdir=/usr/lib64 --enable-shared --disable-static --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libxvid --enable-postproc --enable-gpl --enable-x11grab --extra-cflags='-fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -fPIC -I/usr/include/gsm' --enable-debug --disable-stripping --enable-libgsm --enable-libschroedinger --enable-libdirac --enable-avfilter --enable-libvpx --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libdc1394 --enable-pthreads --enable-librtmp
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 7. 0 / 53. 7. 0
libavformat 53. 4. 0 / 53. 4. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 2. 0. 0 / 2. 0. 0
libpostproc 51. 2. 0 / 51. 2. 0
[mpeg @ 0x635660] max_analyze_duration 5000000 reached at 5005000
Input #0, mpeg, from 'ashes_dump.mpg':
Duration: 01:02:22.33, start: 0.280633, bitrate: 7745 kb/s
Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 32:27 DAR 16:9], 7000 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0.1[0x80]: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
Stream #0.2[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
Stream #0.3[0x21]: Subtitle: dvdsub
[srt @ 0x63d340] Estimating duration from bitrate, this may be inaccurate
Input #1, srt, from 'rus.srt':
Duration: N/A, start: 6.053000, bitrate: N/A
Stream #1.0: Subtitle: srt
[srt @ 0x6469c0] Estimating duration from bitrate, this may be inaccurate
Input #2, srt, from 'ukr.srt':
Duration: N/A, start: 5.252000, bitrate: N/A
Stream #2.0: Subtitle: srt
[buffer @ 0xb87020] w:720 h:480 pixfmt:yuv420p tb:1/1000000 sar:32/27 sws_param:
[libx264 @ 0x634460] Default settings detected, using medium profile
[libx264 @ 0x634460] using SAR=32/27
[libx264 @ 0x634460] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 0x634460] profile Main, level 3.0
[libx264 @ 0x634460] 264 - core 116 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x1:0 me=dia subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=1 sliced_threads=0 nr=0 decimate=0 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=16 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=750 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=2000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'res.mkv':
Metadata:
encoder : Lavf53.4.0
Stream #0.0(ENG): Video: libx264, yuv420p, 720x480 [PAR 32:27 DAR 16:9], q=2-31, 2000 kb/s, 1k tbn, 29.97 tbc
Stream #0.1(ENG): Audio: ac3, 48000 Hz, stereo, 192 kb/s
Stream #0.2(RUS): Subtitle: srt
Stream #0.3(ENG): Audio: ac3, 48000 Hz, 5.1, 448 kb/s
Stream #0.4(UKR): Subtitle: srt
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Stream #1.0 -> #0.2
Stream #0.2 -> #0.3
Stream #2.0 -> #0.4
Как поменять порядок?
2. Стоит ли использовать ключ -x264opts вместо того, чтобы указывать опции через ключи самого ffmpeg? Правда ffmpeg поддерживает далеко не все опции x264. Я указываю все опции кодирования (в том числе и битрейт, и номер прохода) видео через x264opts. Глюков от этого не будет?
3. Насколько я понял, ffmpeg не может использовать в качестве источника папку с DVD. Или я не прав?
4. Есть какие-нибудь особенности кодирования видео в h264 у ffmpeg по сравнению с mencoder?