我的意见如下:
Input #0, mpeg, from 'D:\Videos\2015.mpg':
Duration: 01:49:08.74, start: 0.220000, bitrate: 4940 kb/s
Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bt470bg), 720x576 [SAR 16:15 DAR 4:3], max. 7500 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1c0]: Audio: mp2, 48000 Hz, stereo, s16p, 224 kb/s
该文件大小接近 4GB,播放时间不到 2 小时。这是典型的(甚至可能比典型的)VHS 质量,中间穿插几分钟的空白屏幕(因此需要 VBR)。
CPU 为 4 核 Inteal 3770K:MMX2 SSE2Fast SSSE3 SSE4.2 AVX
问题:我应该使用哪些 ffmpeg 参数来合理快速地将此输入转换为 MP4(H264/AAC)(比实际速率快几倍,即此文件在 30 分钟内完成)并将文件大小至少减少一半。我猜质量不是那么重要,因为它无论如何都是 VHS 翻录,并且有很多静态和伪影。我应该使用哪些命令行开关(适用于 Windows)?
编辑/更新/背景故事:
在得到建议之后,我稍微详细说明了一下...我本来希望直接使用 ffmpeg 将 VHS 视频捕获为 MP4,但问题是我的捕获设备驱动程序配置/安装如下:
C:\Tools\video.tools\ffmpeg-20151123-git-12a419d-win64-static\bin>ffmpeg -loglevel verbose -list_options true -f dshow -i video="ezcap Video Grabber" -loglevel verbose
ffmpeg version N-76822-g12a419d Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 5.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
libavutil 55. 9.100 / 55. 9.100
libavcodec 57. 16.100 / 57. 16.100
libavformat 57. 19.100 / 57. 19.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 15.100 / 6. 15.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
[dshow @ 0000018baeadb920] DirectShow video device options (from video devices)
[dshow @ 0000018baeadb920] Pin "Video YUV Out" (alternative pin name "2")
[dshow @ 0000018baeadb920] pixel_format=uyvy422 min s=160x120 fps=25 max s=720x576 fps=25
[dshow @ 0000018baeadb920] pixel_format=uyvy422 min s=160x120 fps=29.97 max s=720x486 fps=29.97
[dshow @ 0000018baeadb920] pixel_format=uyvy422 min s=160x120 fps=29.97 max s=720x480 fps=29.97
[dshow @ 0000018baeadb920] Pin "Audio PCM Out" (alternative pin name "3")
[dshow @ 0000018baeadb920] Crossbar Switching Information for ezcap Video Grabber:
[dshow @ 0000018baeadb920] Crossbar Output pin 0: "Video Decoder" related output pin: 1 current input pin: 1 compatible input pins: 1 2
[dshow @ 0000018baeadb920] Crossbar Output pin 1: "Audio Decoder" related output pin: 0 current input pin: 5 compatible input pins: 5
[dshow @ 0000018baeadb920] Crossbar Input pin 0 - "Video Tuner" related input pin: 4
[dshow @ 0000018baeadb920] Crossbar Input pin 1 - "Video Composite" related input pin: 5
[dshow @ 0000018baeadb920] Crossbar Input pin 2 - "S-Video" related input pin: 5
[dshow @ 0000018baeadb920] Crossbar Input pin 3 - "Video YRYBY" related input pin: 5
[dshow @ 0000018baeadb920] Crossbar Input pin 4 - "Audio Tuner" related input pin: 0
[dshow @ 0000018baeadb920] Crossbar Input pin 5 - "Audio Line" related input pin: 1
问题是没有单独的 DirectShow 音频设备 - 只有视频设备(具有视频和音频引脚)。ffmpeg 似乎在尝试使用这样的设置捕获视频和音频时遇到问题:
ffmpeg -loglevel verbose -f dshow -i video="ezcap Video Grabber":audio="ezcap Video Grabber" test5.mp4
ffmpeg version N-76822-g12a419d Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 5.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
libavutil 55. 9.100 / 55. 9.100
libavcodec 57. 16.100 / 57. 16.100
libavformat 57. 19.100 / 57. 19.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 15.100 / 6. 15.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
[dshow @ 0000017449b7c0e0] Could not find audio only device with name [ezcap Video Grabber] among source devices of type audio.
[dshow @ 0000017449b7c0e0] Searching for audio device within video devices for ezcap Video Grabber
[dshow @ 0000017449b7c0e0] Could not run graph (sometimes caused by a device already in use by other application)
video=ezcap Video Grabber:audio=ezcap Video Grabber: Input/output error
因此,我不得不使用捕获设备附带的软件:ArcSoft ShowBiz,虽然它可以完成工作,但由于设置和用户界面复杂,并且它生成的是 MPEG2 而不是更紧凑的 MP4,因此效果并不理想。
答案1
从 VHS 源进行编码
ffmpeg -i input -vf "yadif=1:1,hqdn3d=3,drawbox=y=ih-h:w=0:h=6:t=max,format=yuv420p" \
-crf 23 -preset medium -c:a aac -movflags +faststart \
-metadata title="Title" output.mp4
过滤器
可以使用一些过滤器来改进 VHS 输入的编码:
yadif
是一个反隔行扫描器。请参阅文档并尝试不同的模式,看看哪种模式最适合你。或者,你可以尝试w3fdif
反隔行过滤器,但我还没有测试过。hqdn3d
是一款视频降噪器。VHS 可能会很嘈杂,因此请尝试各种值,也可以尝试不使用它。降噪可以提高压缩率,但降噪过多会增加明显的模糊。drawbox
在这个例子中,在最底部制作一个 6 像素的黑框来掩盖任何头部切换噪音。您可能需要调整高度,或者直接删除它。这比裁剪更好,因为只需覆盖它就可以避免改变纵横比:如果这不是问题,请随意庄稼反而。format
添加是为了使用广泛兼容的像素格式。但这与您的输入无关,因为它已经是yuv420p
。
其他选择
-crf
并-preset
允许您调整输出质量和编码速度。请参阅FFmpeg Wiki:H.264 视频编码指南。-movflags +faststart
如果您的观众将通过渐进式下载观看,则很有用。编码后,它会将一些信息移至文件的开头,以便可以更快地开始播放。-strict experimental
如果使用旧版本,则需要添加ffmpeg
:本机 FFmpeg AAC 编码器曾经被认为是实验性的,但现在不再如此。