我有一个安卓视频:
$ mediainfo 20140324_192544.mp4
General
Complete name : 20140324_192544.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom
File size : 7.65 MiB
Duration : 19s 861ms
Overall bit rate : 3 232 Kbps
Encoded date : UTC 2014-03-24 18:26:05
Tagged date : UTC 2014-03-24 18:26:05
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Format settings, GOP : M=1, N=30
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 19s 780ms
Bit rate : 3 112 Kbps
Width : 640 pixels
Height : 480 pixels
Display aspect ratio : 4:3
Frame rate mode : Variable
Frame rate : 30.283 fps
Minimum frame rate : 18.211 fps
Maximum frame rate : 30.405 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.334
Stream size : 7.33 MiB (96%)
Title : VideoHandle
Language : English
Encoded date : UTC 2014-03-24 18:26:05
Tagged date : UTC 2014-03-24 18:26:05
Material_Duration : 19802
Material_StreamSize : 7693757
Material_FrameCount : 599
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 19s 861ms
Bit rate mode : Constant
Bit rate : 128 Kbps
Nominal bit rate : 96.0 Kbps
Channel(s) : 1 channel
Channel positions : Front: C
Sampling rate : 48.0 KHz
Compression mode : Lossy
Stream size : 310 KiB (4%)
Title : SoundHandle
Language : English
Encoded date : UTC 2014-03-24 18:26:05
Tagged date : UTC 2014-03-24 18:26:05
现在,我进行了一些积极的调整:
$ avconv -i 20140324_192544.mp4 -c:v libx264 -c:a copy -s:v 24x18 -b:v 3k 20140324_192544_2.mp4
avconv version 0.8.10-4:0.8.10-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
built on Feb 6 2014 20:56:59 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '20140324_192544.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2014-03-24 18:26:05
Duration: 00:00:19.86, start: 0.000000, bitrate: 3231 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 640x480, 3108 kb/s, PAR 65536:65536 DAR 4:3, 30.25 fps, 90k tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2014-03-24 18:26:05
Stream #0.1(eng): Audio: aac, 48000 Hz, mono, s16, 128 kb/s
Metadata:
creation_time : 2014-03-24 18:26:05
File '20140324_192544_2.mp4' already exists. Overwrite ? [y/N] y
[buffer @ 0x1bb3000] w:640 h:480 pixfmt:yuv420p
[scale @ 0x1baf7a0] w:640 h:480 fmt:yuv420p -> w:24 h:18 fmt:yuv420p flags:0x4
[libx264 @ 0x1bcb180] using SAR=1/1
[libx264 @ 0x1bcb180] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowCTZ SlowAtom
[libx264 @ 0x1bcb180] profile Main, level 4.2
[libx264 @ 0x1bcb180] 264 - core 120 r2151 a3f4407 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=0 b_adapt=1 b_bias=0 direct=1 weightb=0 open_gop=1 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=3 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=1:1.00
Output #0, mp4, to '20140324_192544_2.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2014-03-24 18:26:05
encoder : Lavf53.21.1
Stream #0.0(eng): Video: libx264, yuv420p, 24x18 [PAR 1:1 DAR 4:3], q=-1--1, 3 kb/s, 180k tbn, 90k tbc
Metadata:
creation_time : 2014-03-24 18:26:05
Stream #0.1(eng): Audio: libvo_aacenc, 48000 Hz, mono, 128 kb/s
Metadata:
creation_time : 2014-03-24 18:26:05
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> libx264)
Stream #0:1 -> #0:1 (copy)
Press ctrl-c to stop encoding
frame=1779206 fps=2348 q=-1.0 Lsize= 44331kB time=19.77 bitrate=18370.2kbits/s dup=1778607 drop=0
video:23072kB audio:310kB global headers:0kB muxing overhead 89.594479%
[libx264 @ 0x1bcb180] frame I:7117 Avg QP:51.00 size: 25
[libx264 @ 0x1bcb180] frame P:441244 Avg QP:51.00 size: 17
[libx264 @ 0x1bcb180] frame B:1330845 Avg QP:51.00 size: 12
[libx264 @ 0x1bcb180] consecutive B-frames: 0.0% 0.8% 0.0% 99.2%
[libx264 @ 0x1bcb180] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0x1bcb180] mb P I16..4: 0.0% 0.0% 0.0% P16..4: 0.0% 0.0% 0.0% 0.0% 0.0% skip:100.0%
[libx264 @ 0x1bcb180] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.0% 0.0% 0.0% direct: 0.0% skip:100.0%
[libx264 @ 0x1bcb180] final ratefactor: 128.61
[libx264 @ 0x1bcb180] coded y,uvDC,uvAC intra: 0.0% 38.5% 0.0% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x1bcb180] i16 v,h,dc,p: 50% 0% 50% 0%
[libx264 @ 0x1bcb180] i8c dc,h,v,p: 100% 0% 0% 0%
[libx264 @ 0x1bcb180] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1bcb180] kb/s:9560.28
结果是一个 45MB 的文件:
$ mediainfo 20140324_192544_2.mp4
General
Complete name : 20140324_192544_2.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom
File size : 43.3 MiB
Duration : 19s 862ms
Overall bit rate mode : Variable
Overall bit rate : 18.3 Mbps
Encoded date : UTC 2014-03-24 18:26:05
Tagged date : UTC 2014-03-24 18:26:05
Writing application : Lavf53.21.1
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : Yes
Format settings, ReFrames : 3 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 19s 769ms
Bit rate : 9 563 Kbps
Nominal bit rate : 3 000 bps
Width : 24 pixels
Height : 18 pixels
Display aspect ratio : 4:3
Frame rate mode : Constant
Frame rate : 90 000.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.246
Stream size : 22.5 MiB (52%)
Writing library : x264 core 120 r2151 a3f4407
Encoding settings : cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x1:0x111 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=3 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=0 / b_adapt=1 / b_bias=0 / direct=1 / weightb=0 / open_gop=1 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=abr / mbtree=1 / bitrate=3 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.25 / aq=1:1.00
Language : English
Encoded date : UTC 2014-03-24 18:26:05
Tagged date : UTC 2014-03-24 18:26:05
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 19s 862ms
Bit rate mode : Variable
Bit rate : 128 Kbps
Channel(s) : 1 channel
Channel positions : Front: C
Sampling rate : 48.0 KHz
Compression mode : Lossy
Stream size : 310 KiB (1%)
Language : English
Encoded date : UTC 2014-03-24 18:26:05
Tagged date : UTC 2014-03-24 18:26:05
我的参数肯定有问题,对吧!?我漏掉了什么?谢谢。
答案1
尺寸增加是因为您的输出视频的帧速率超过 90 fps。不要问我为什么会发生这种情况 - 这很可能是 avconv 的一个错误,它在较新的版本中已经可用。他们可能已经修复了它。
如果你想减小原始视频的文件大小,我建议要么降低分辨率(到合理的水平),同时明确设置比特率,要么只用恒定质量模式重新编码(慢性肾衰竭在 x264 中),例如:
avconv -i input.mp4 -c:v libx264 -crf 28 -c:a copy output.mp4
CRF 值为 28 或更高将导致“质量较低”。当然,您必须使用这些设置。
答案2
我认为 ffmpeg / avconv 不知道如何将 VFR h.264 放入 MP4 容器中,因此它们必须复制大量帧。它使用足够高的帧速率,以便能够为输入视频中的每个帧在输出视频中生成一个帧。由于手机出于某种原因实现了真正的 VFR,而不仅仅是在几个帧速率之间切换,因此 avconv 选择9万帧每秒。实际上,看起来 90k 来自时间基数分子。(90k tbn
)我忘记了 ffmpeg / avconv 如何在内部存储时间戳,我必须再看一遍。我不知道它是否与 mp4 的设计方式相匹配。
这就是为什么您的视频的平均 QP 为 51,因为几乎每一帧都是前一帧的精确副本,而且帧数如此之多,以至于无论 x264 做什么,一帧至少要占用几个字节。仅仅将所有这些重复帧编码为跳过每个宏块(即与之前相同)就会导致您的比特率无端飙升。
ffmpeg(我假设是 avconv)可以将 VFR h.264 输出到 Matroska 容器中。使用以 .mkv 结尾的文件名执行相同的命令行应该可以达到预期效果。我不知道是否可以使用其他工具将 VFR mkv 重新混合为 mp4。mkv 是一种很好的容器格式,除非您需要兼容某些不支持它的格式,否则请使用它。
如果您坚持通过制作恒定帧速率输出视频来丢失一些帧时序信息,则需要找到其他方法。也许是 libav 过滤器?或者可能只是使用 avconv 选项来指定您想要的输出 FPS。x264 可以仅用几个字节来编码重复帧,但如果您的 FPS 如此之高以至于有很多重复,则大多数潜在参考帧将是重复的,实际上没有用。如果您向 x264 输入许多重复帧,那么增加连续 b 帧的数量是一个好主意。它将使用 b 帧来编码重复项,这占用更少的空间,并且我认为有助于它将非重复项保留为参考帧。