38

这是感兴趣的视频的 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

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

尝试

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

帮助!

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

4

3 回答 3

106

自 2012 年发布此帖子以来,发生了很多变化。我正在为像我这样从搜索引擎中找到此内容的人添加此答案。我在以下方面很幸运:

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

以下是关于每个参数的作用的简短说明:

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

更多详细信息请参见官方文档

于 2015-01-21T17:54:42.783 回答
6

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

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

[编辑:HEVCAV1现在是最先进的技术。正如我所说,这些都是快速发展的领域!]

首先,我会使用 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>"

Staxrip 具有将预设切换为安慰剂、调整电影源(当然假设这不是动画)以及将线程数减少到 1 的选项。

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

大多数对视频进行编码或生产对视频进行编码的产品的公司真的不知道他们在做什么,即使他们这样做了,他们也没有使用这些设置进行编码所需的 CPU 能力,所以除了适度的通过降低帧速率来减小文件大小,使用具有最严格设置的智能编码器也会使文件大小急剧下降。

如果您想绝对确定生成的视频看起来尽可能接近 VirtualDub 的输出,没有人可以使用 CRF17 区分,但文件会非常大。您不妨压缩 VirtualDub 的输出(嗯,还不错!)。

于 2012-06-12T22:25:26.960 回答
0

无论如何,您都需要对视频进行转码。转码意味着你将解码你的流,改变帧率(在简单的情况下丢帧)然后再次编码。编码配置甚至编解码器都不取决于您的视频最初是如何编码的,因此您可以使用任何适合您需要的东西。如果您需要尽可能高的质量,只需首先尝试使用高配置进行编码。然后,您可以尝试使用众多 h.264 编码参数对其进行微调。

于 2012-06-12T22:05:20.303 回答