mol*_*ane 56 h.264 ffmpeg video-conversion video-encoding
我想使用 h.264 编解码器将 AVI 文件压缩为 MP4。我无法获得相同的质量。我怎样才能压缩它?
原始视频屏幕:

FFmpeg 控制台输出 ( ffmpeg -i input.avi):
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
Metadata:
encoder : VirtualDubMod 1.5.10.2 (build 2542/release)
Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified
Run Code Online (Sandbox Code Playgroud)
FFmpeg 命令:
ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4
Run Code Online (Sandbox Code Playgroud)
测试 1 屏幕:

FFmpeg 控制台输出 ( ffmpeg -i 1.mp4)
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.93.0
Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
At least one output file must be specified
Run Code Online (Sandbox Code Playgroud)
FFmpeg 命令:
ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4
Run Code Online (Sandbox Code Playgroud)
测试 2 屏幕:

FFmpeg 控制台输出 ( ffmpeg -i 2.mp4)
FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.93.0
Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
At least one output file must be specified
Run Code Online (Sandbox Code Playgroud)
slh*_*hck 70
首先,安装更新版本的 FFmpeg——从下载页面获取静态构建。
使用vpre预设(这是为ffmpeg设置设置默认值的一种方式,而不是编码器设置)并不是真正必要的;您通常希望使用-preset编码器定义的选项。
对于您的两种情况,输出质量低的原因如下:
在第一种情况下,您使用的crf 25是恒定速率因子,它会为您提供比 x264 编码器的默认值(即 23)更差的质量。CRF 控制质量。尝试设置较低的 CRF,可能是 20、18 等。这里,较低意味着更好的质量,但它会增加文件大小。粗略地说,CRF 中的 6 更改为您提供原始平均比特率的两倍/一半。
由于代损失,您必须设置较低的 CRF 。您正在编码已经编码的内容,因此您再次丢弃了视觉信息。这从来都不是好事,但如果必须这样做,您将不得不设置更高的质量,以免从输入视频中删除太多信息。
在第二种情况下,您尝试将恒定比特率设置为 2 MBit/s。您的输入视频大致具有相同的比特率。现在,对于相同的比特率,x264 提供比 MPEG-4 视觉编码器更好的视觉质量,但由于代数损失,您可能希望使用比原始比特率更高的比特率 - 否则最终会压缩掉太多信息。
此外,恒定比特率编码可能会导致某些段落看起来不错,但视频的其他部分看起来更糟。如果你不让编码器自由选择它想在某件事上花费的比特数,你就会以知道目标文件大小为代价而牺牲质量。
x264 确实具有恒定比特率模式,但被认为不如其他编码方法。实际上,两遍编码并不意味着以最佳质量为目标,所以从头开始。
话虽如此,请尝试以下操作:
ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4
Run Code Online (Sandbox Code Playgroud)
如果libfdk_aac不可用,请改用它:
ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4
Run Code Online (Sandbox Code Playgroud)
主要的质量控制旋钮将是您的 CRF 设置。如果您需要更好的质量,请尝试使用较低的值。
您也可以选择veryslow预设,这会给您更好的压缩,但编码显然需要更长的时间。
如果您无法以合理的文件大小获得质量不错的文件,那么您就不走运了。最好保持原始文件原样,无需重新编码。当您压缩已经压缩的内容时,没有神奇的“保持相同质量”工具。
| 归档时间: |
|
| 查看次数: |
171982 次 |
| 最近记录: |