重新采样H264视频以降低帧速率,同时保持高图像质量

Bri*_*ion 35 video ffmpeg mencoder transcoding mplayer

这是感兴趣的视频的mplayer输出:

br@carina:/tmp$ mplayer foo.mov 
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing foo.mov.
libavformat file format detected.
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0, -alang eng
VIDEO:  [H264]  1280x720  24bpp  59.940 fps  2494.2 kbps (304.5 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 15999->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1280x720 => 1280x720 Planar YV12
Run Code Online (Sandbox Code Playgroud)

我想使用ffmpeg,mencoder或其他一些命令行视频转码器将此视频重新采样到较低的帧速率而不会降低图像质量.也就是说,每个框架应尽可能保持清晰.

尝试

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • 目标帧速率--25fps - 已实现,但单个帧"块状".
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • 视频实际上是不可见的.

救命!

这似乎是一个简单的用例.我很惊讶明显的事情不起作用.我的方法有问题吗?

Cod*_*Med 94

自2012年发布以来,已经发生了很多变化.我正在为像我这样从搜索引擎中找到这个的人添加这个答案.我好运以下:

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4
Run Code Online (Sandbox Code Playgroud)

以下是每个参数的简要说明:

  • -y :无需询问即覆盖输出文件
  • -i source.mp4 :输入文件名
  • -r 25 :输出帧速率(以每秒帧数为单位)
  • -s 160x90 :输出帧大小(以像素为单位) - 插入缩放视频滤镜
  • -c:v libx264 :输出视频编码器
    • -c:v-codec:v和的缩写-vcodec
  • -b:v 3M :视频比特率(以bit/s为单位)传递给libx264编码器
  • -strict -2 :管理标准合规; -2允许实验性功能 - 在版本低于2015-12-05的版本中启用原生FFmpeg AAC音频编码器所需,请参见此处,AAC现在是默认的音频编码器.
  • -movflags faststart:将索引移动到输出文件的开头(mov和mp4格式特定参数)

有关详细信息,请参阅官方文档.

  • 完美的工作. (4认同)
  • 请注意,这也会改变视频的长度,因此如果输入视频有 10 帧,输出视频仍将具有相同的 10 帧,但总运行长度会更长或更短。 (2认同)

Cha*_*rns 6

正如Andy T所说,你绝对必须重新编码视频,但这并不意味着必须以任何明显的方式降低质量.

首先,确保您没有使用旧软件.视频编解码器是一个快速发展的领域,每隔几周就会显着提升.x264是目前最先进的视频编码器软件.这可能是mplayer使用的,但你可以从www.x264.nl获得最新的真实版本

首先,我将使用VirtualDub解压缩为无损视频类型,这将形成一个非常大的文件.VirtualDub还可以降低帧速率.看到这里.

接下来,使用它作为x264的输入.我建议你使用像Staxrip这样的辅助软件(将最新的32位8位每通道x264放在StaxRip\Applications\x264中.

如果您希望在不太可能注意到差异的情况下使用最小文件大小的绝对最佳质量,请使用这样的命令行(使用x264):

x264 --preset placebo --tune film --crf 22 --level 4.1 --threads 1 --thread-input --sar 12:11 --output "<target>" "<source>"
Run Code Online (Sandbox Code Playgroud)

Staxrip有选项可将预设切换为安慰剂,调整电影源(假设这当然不是动画),并将线程数减少到1.

您可以将"--crf 22"更改为21以获得更大,质量更好的视频,但我发现CRF22大约是我很难注意到差异的地方,即使逐帧比较也是如此.其他设置的任何更改都可能会降低质量或增加文件大小而不会提高质量.增加线程数将大大提高编码速度(显然在多核系统上),但会略微降低质量(或者在这种情况下,因为我们使用基于质量的CRF,会稍微增加文件大小,比如4线程的1%以下).

大多数编码视频或制作视频编码产品的公司都不知道他们在做什么,即使他们这样做,他们也没有使用这些设置进行编码所需的CPU功率,所以除了谦虚之外通过降低帧速率来减小文件大小,使用最严格设置的智能编码器,您的文件大小也会急剧下降.

如果你想绝对确定生成的视频看起来尽可能接近VirtualDub的输出,没有人能用CRF17来区分,但文件会非常大.你可能只是压缩VirtualDub的输出(好吧,不是那么糟糕!).

  • - 预设安慰剂是浪费时间.http://trac.ffmpeg.org/wiki/x264EncodingGuide#FAQ (3认同)