![Ffmpeg 使用 -map 0 时丢失流](https://linux22.com/image/1488019/Ffmpeg%20%E4%BD%BF%E7%94%A8%20-map%200%20%E6%97%B6%E4%B8%A2%E5%A4%B1%E6%B5%81.png)
我在 Ubuntu 14.04 上使用 ffmpeg 时遇到了一个奇怪的问题。我运行了一个命令
ffmpeg -i output2.avi -c:v h264 -minrate 2000k -maxrate 5000k -bufsize 2000k -profile:v high -level:v 4 -coder 1 -s 640x360 -bf 0 -pix_fmt yuv420p -r 25 -g 25 -c:a aac -ar 48k -b:a 321k -map 0 -y outpu.mp4
它在控制台中提供了这样的常见输出(已经带有 -loglevel verbose):
ffmpeg version N-79004-g2e6636a Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
configuration: --prefix=/home/ngoral/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ngoral/ffmpeg_build/include --extra-ldflags=-L/home/ngoral/ffmpeg_build/lib --bindir=/home/ngoral/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree
libavutil 55. 19.100 / 55. 19.100
libavcodec 57. 28.101 / 57. 28.101
libavformat 57. 28.101 / 57. 28.101
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 39.102 / 6. 39.102
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
[avi @ 0x2707800] parser not found for codec dvvideo, packets or times may be invalid.
Last message repeated 1 times
Input #0, avi, from 'output2.avi':
Metadata:
encoder : Lavf57.28.101
Duration: 00:00:20.04, start: 0.000000, bitrate: 28911 kb/s
Stream #0:0: Video: dvvideo, 1 reference frame (dvsd / 0x64737664), yuv420p, 720x576 [SAR 16:15 DAR 4:3], 28684 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 192 kb/s
Stream #0:2: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 64 kb/s
Stream #0:3: Audio: aac ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, fltp, 117 kb/s
Matched encoder 'libx264' for codec 'h264'.
[graph 0 input from stream 0:0 @ 0x2784f60] w:720 h:576 pixfmt:yuv420p tb:1/25 fr:25/1 sar:16/15 sws_param:flags=2
[scaler for output stream 0:0 @ 0x2749d20] w:640 h:360 flags:'bicubic' interl:0
[scaler for output stream 0:0 @ 0x2749d20] w:720 h:576 fmt:yuv420p sar:16/15 -> w:640 h:360 fmt:yuv420p sar:3/4 flags:0x4
[graph 1 input from stream 0:1 @ 0x27a4fc0] tb:1/48000 samplefmt:s16p samplerate:48000 chlayout:0x3
[audio format for output stream 0:1 @ 0x27a5380] auto-inserting filter 'auto-inserted resampler 0' between the filter 'Parsed_anull_0' and the filter 'audio format for output stream 0:1'
[auto-inserted resampler 0 @ 0x27a7ae0] ch:2 chl:stereo fmt:s16p r:48000Hz -> ch:2 chl:stereo fmt:fltp r:48000Hz
[graph 2 input from stream 0:2 @ 0x27a6620] tb:1/48000 samplefmt:s16p samplerate:48000 chlayout:0x3
[audio format for output stream 0:2 @ 0x27a6440] auto-inserting filter 'auto-inserted resampler 0' between the filter 'Parsed_anull_0' and the filter 'audio format for output stream 0:2'
[auto-inserted resampler 0 @ 0x27b6be0] ch:2 chl:stereo fmt:s16p r:48000Hz -> ch:2 chl:stereo fmt:fltp r:48000Hz
[graph 3 input from stream 0:3 @ 0x27b6560] tb:1/48000 samplefmt:fltp samplerate:48000 chlayout:0x3
[libx264 @ 0x27889a0] using SAR=3/4
[libx264 @ 0x27889a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x27889a0] profile High, level 4.0
[libx264 @ 0x27889a0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2 keyint=25 keyint_min=2 scenecut=40 intra_refresh=0 rc_lookahead=25 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=5000 vbv_bufsize=2000 crf_max=0.0 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'outpu.mp4':
Metadata:
encoder : Lavf57.28.101
Stream #0:0: Video: h264 (libx264), -1 reference frame ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 3:4 DAR 4:3], q=-1--1, max. 5000 kb/s, 25 fps, 12800 tbn, 25 tbc
Metadata:
encoder : Lavc57.28.101 libx264
Side data:
cpb: bitrate max/min/avg: 5000000/0/0 buffer size: 2000000 vbv_delay: -1
Stream #0:1: Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 321 kb/s
Metadata:
encoder : Lavc57.28.101 aac
Stream #0:2: Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 321 kb/s
Metadata:
encoder : Lavc57.28.101 aac
Stream #0:3: Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 321 kb/s
Metadata:
encoder : Lavc57.28.101 aac
Stream mapping:
Stream #0:0 -> #0:0 (dvvideo (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (mp3 (native) -> aac (native))
Stream #0:2 -> #0:2 (mp3 (native) -> aac (native))
Stream #0:3 -> #0:3 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
*** 3 dup!
No more output streams to write to, finishing.e=00:00:19.84 bitrate= 359.9kbits/s dup=3 drop=0 speed=1.15x
frame= 501 fps= 29 q=-1.0 Lsize= 1792kB time=00:00:20.05 bitrate= 732.2kbits/s dup=3 drop=0 speed=1.14x
video:440kB audio:1331kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.155376%
Input file #0 (output2.avi):
Input stream #0:0 (video): 498 packets read (71712000 bytes); 498 frames decoded;
Input stream #0:1 (audio): 834 packets read (480384 bytes); 834 frames decoded (960768 samples);
Input stream #0:2 (audio): 835 packets read (160320 bytes); 835 frames decoded (961920 samples);
Input stream #0:3 (audio): 0 packets read (0 bytes); 0 frames decoded (0 samples);
Total: 2167 packets (72352704 bytes) demuxed
Output file #0 (outpu.mp4):
Output stream #0:0 (video): 501 frames encoded; 501 packets muxed (451055 bytes);
Output stream #0:1 (audio): 939 frames encoded (960768 samples); 940 packets muxed (724261 bytes);
Output stream #0:2 (audio): 940 frames encoded (961920 samples); 941 packets muxed (639072 bytes);
Output stream #0:3 (audio): 0 frames encoded (0 samples); 0 packets muxed (0 bytes);
Total: 2382 packets (1814388 bytes) muxed
[libx264 @ 0x27889a0] frame I:21 Avg QP:15.30 size: 8718
[libx264 @ 0x27889a0] frame P:480 Avg QP:24.52 size: 557
[libx264 @ 0x27889a0] mb I I16..4: 20.4% 55.5% 24.1%
[libx264 @ 0x27889a0] mb P I16..4: 0.0% 0.1% 0.0% P16..4: 7.6% 3.7% 1.7% 0.0% 0.0% skip:86.8%
[libx264 @ 0x27889a0] 8x8 transform intra:56.3% inter:50.3%
[libx264 @ 0x27889a0] coded y,uvDC,uvAC intra: 42.0% 39.5% 27.5% inter: 2.6% 1.4% 0.0%
[libx264 @ 0x27889a0] i16 v,h,dc,p: 36% 52% 3% 10%
[libx264 @ 0x27889a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 56% 20% 14% 2% 1% 1% 2% 2% 2%
[libx264 @ 0x27889a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 42% 26% 7% 4% 3% 4% 5% 5% 4%
[libx264 @ 0x27889a0] i8c dc,h,v,p: 66% 13% 17% 4%
[libx264 @ 0x27889a0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x27889a0] ref P L0: 68.1% 11.5% 13.9% 6.5%
[libx264 @ 0x27889a0] kb/s:179.78
[aac @ 0x2747da0] Qavg: 62719.090
[aac @ 0x2748b20] Qavg: 64509.496
[aac @ 0x27498a0] Qavg: -nan
它似乎输出了所有 3 个音频流,但后来我
ffmpeg -loglevel verbose -i outpu.mp4
并且只获得 2 个音频流:
ffmpeg version N-79004-g2e6636a Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
configuration: --prefix=/home/ngoral/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ngoral/ffmpeg_build/include --extra-ldflags=-L/home/ngoral/ffmpeg_build/lib --bindir=/home/ngoral/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree
libavutil 55. 19.100 / 55. 19.100
libavcodec 57. 28.101 / 57. 28.101
libavformat 57. 28.101 / 57. 28.101
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 39.102 / 6. 39.102
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'outpu.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.28.101
Duration: 00:00:20.06, start: 0.021333, bitrate: 731 kb/s
Stream #0:0(und): Video: h264 (High), 3 reference frames (avc1 / 0x31637661), yuv420p, 640x360 (640x368) [SAR 3:4 DAR 4:3], 180 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 289 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream #0:2(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 254 kb/s
Metadata:
handler_name : SoundHandler
它有什么问题?它在我的 Win 机器上运行良好,在装有 Ubuntu 的虚拟机上运行良好,但在真正的 Ubuntu 上运行时,它的行为就是这样。你有什么想法吗?谢谢!
答案1
重新检查输入文件,查看第三个音频流是否有效。ffmpeg 编码输出显示。
Input stream #0:3 (audio): 0 packets read (0 bytes); 0 frames decoded (0 samples);
因此
Output stream #0:3 (audio): 0 frames encoded (0 samples); 0 packets muxed (0 bytes);
只复制第三个流,看看是否有效
ffmpeg -i output2.avi -c copy -map 0:a:2 test.avi