如何使用 ffmpeg 和 h264_videotoolbox 标志提高输出视频质量?

Ant*_*ong 15 ffmpeg

目前我正在使用这个命令来转换

ffmpeg -i <srcfile> -vcodec libx264 -profile:v main -level 3.1 -preset slower -crf 18 -x264-params ref=4 -acodec copy -movflags +faststart <outfile>
Run Code Online (Sandbox Code Playgroud)

转换一些行车记录仪镜头以便在 iOS 设备上查看。

在具有 16G RAM 的 2017 Macbookpro 上,上述命令大约需要 30 分钟才能完成。

我想加快速度。我尝试过的一件事是利用计算机中的 GPU。因此我添加了标志-c:v h264_videotoolbox

速度加快了很多。我可以在1分钟内完成转换。

然而,当我检查输出时,GPU 版本出现条带且模糊。

这是一个屏幕截图。左边是CPU版本,右边是GPU版本。

在此输入图像描述

为了突出差异,以下是视频的部分内容

  1. 倒影中的树木

在此输入图像描述

  1. 波纹铁皮墙

在此输入图像描述

我可以操纵任何开关来使 GPU 版本更清晰吗?

llo*_*gan 14

与 x264 相比,这是一个简单的 H.264 编码器,因此您无法获得相同的每比特率质量。h264_videotoolbox 针对速度进行了优化,不支持-crf.

您可以使用 查看特定于该编码器的一些选项ffmpeg -h encoder=h264_videotoolbox,但由于它们可能已经设置为“自动”(我没有通过源代码确认,并且我没有硬件来尝试它),这些附加选项可能不会产生太大作用的差异。

因此,您只需增加比特率,例如使用-b:v 8000k.

或者继续使用 libx264 和更快的-preset.


小智 6

我看到这个问题已经在大约两年前得到了解答。帮助其他可能偶然发现该线程的人。我使用 VideoToolbox 作为编码器,使用 GPU 或软件进行加速,获得了很好的结果,具体取决于我使用的机器。

\n

正如已经提到的,设置一个恒定的比特率并向上调整它是产生与大型源文件几乎无法区分的结果的关键。当与其他关键参数配合使用时,恒定比特率与高质量输出的两遍编码一样有效,并且比两遍编码快得多。

\n

可能看起来违反直觉,但在所有线程上全速运行的计算机对视频进行编码不会给您带来最佳结果。一些研究人员已经证明,如果所有 CPU 线程都参与编码,质量实际上会下降。最好使用更少的线程,甚至使用第 3 方应用程序来限制 ffmpeg(根据我的经验,编码不会显着减慢)。因此,限制较新的多线程台式机和笔记本电脑上的线程。

\n

目标比特率的常见做法(在 Netflix、Amazon 上看到)自然会因分辨率而异:1080p 至少为 5,000kbps;720p 3,500。为了显着提高视频质量,编码器比特率应至少设置为常用比特率的 1.5 倍:即 1080p 为 7,500,720p 为 5,250。4K GoPro 或行车记录仪也是如此。

\n

我经常使用蓝光库中的大型电影文件,并创建原始大小 1/3 到 1/2 的精简版本(20G 原始文件让位于 8-10GB 文件,且没有明显的质量损失. 另外:帧速率。从源文件到精简文件保持相同的帧速率至关重要,因此该参数很重要。对于院线电影、欧洲电视和北美电视,帧速率分别为 24fps、25fps 或 30fps。(除了将胶片传输到电视屏幕时,大多数情况下 24fps 会变成 23.976fps。)当然 60fps 对于类似 GoPro 的相机来说很常见,但在这里 30fps 将是一个合理的选择。

\n

正是这种对帧率和比特率的控制使 ffmpeg 保持在检查状态,并为您提供可预测、可重复的结果。不是一个错误的、比您开始时使用的文件还要大的巨大文件。

\n

我在 Mac 上工作,因此命令行上可能略有不同,这里我使用 VideoToolbox 作为软件编码器,但典型的命令如下:

\n
ffmpeg -loglevel error -stats -i source.video -map 0:0 -filter:v fps\\=24000/1001 -c:v h264_videotoolbox -b:v 8500k -profile 3 -level 41 -coder cabac -threads 4 -allow_sw:v 1 -map 0:1 -c:a:0 copy -disposition:a:0 default -map 0:6 -c:s:0 copy -disposition:s:0 0 -metadata:g title\\=\xe2\x80\x9cIf you want file title in the metadata, goes here\xe2\x80\x9d -default_mode passthrough \xe2\x80\x98outfile.mkv\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n
   -loglevel error (to troubleshoot errors)\n   -stats (provides progess status in terminal window)\n   -i infile (source video to transcode)\n   -map 0:0 (specify each stream in the original to map to output)\n   -filter:v fps\\=24000/1001 (framerate of 23.976, like source)\n   -c:v h264_videotoolbox (encoder)\n   -b:v (set bitrate, here I chose 8500k) \n   -profile 3 -level 41 (h264 profile high, level 4.1)\n   -coder cabac (cabac coder chosen)\n   -threads 4  (limit of 4 cpu threads, of 8 on this laptop)\n   -allow_sw:v 1  (using VideoToolbox software encoding for accleration; GPU is not enabled)\n   -map 0:1 -c:a:0 copy -disposition:a:0 default (copies audio stream over, unchanged, as default audio)\n   -map 0:6 -c:s:0 copy -disposition:s:0 0 (copies subtitle stream over, not as default ... ie, will play subtitles automatically)\n   -metadata:g (global metadata, you can reflect filename in metadata)\n   -default_mode passthrough (allow audio w/o further processing) \n    outfile (NOTE: no dash precedes filename/path. Chose mkv format to\n   hold my multiple streams; mp4 or other formats work just fine ... as\n   long as contents are appropriate for format.)\n
Run Code Online (Sandbox Code Playgroud)\n