首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ffmpeg和h264_videotoolbox标志提高输出视频质量?

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

Stack Overflow用户
提问于 2020-08-18 02:11:16
回答 4查看 10.8K关注 0票数 9

目前,我正在使用此命令转换

代码语言:javascript
复制
ffmpeg -i <srcfile> -vcodec libx264 -profile:v main -level 3.1 -preset slower -crf 18 -x264-params ref=4 -acodec copy -movflags +faststart <outfile>

将一些仪表盘镜头转换为在iOS设备上观看。

上面的命令花了大约30分钟完成了一个带有16G内存的2017年Macbookpro。

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

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

然而,当我检查输出时,GPU版本受到显带和模糊的影响。

这是截图。左边是CPU版本,右边是GPU版本。

为了突出区别,下面是视频的部分

倒影中的

  1. 波纹铁板壁

有什么开关,我可以操纵,使GPU版本更清晰吗?

EN

回答 4

Stack Overflow用户

发布于 2020-08-18 19:01:52

与x264相比,这是一个简单的H.264编码器,因此您不会获得相同的质量/比特率。h264_videotoolbox是为速度而优化的,不支持-crf

您可以使用ffmpeg -h encoder=h264_videotoolbox查看特定于此编码器的一些选项,但由于它们可能已经设置为"auto“(我没有通过源代码确认,也没有硬件来尝试),这些附加选项可能不会有太大区别。

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

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

票数 8
EN

Stack Overflow用户

发布于 2022-05-17 15:44:36

我看到这个问题在两年前就已经得到了答案。为那些可能会在线上绊倒的人而跳槽。我得到了很好的结果与VideoToolbox作为编码器,使用GPU或软件加速,取决于我使用的机器。

如前所述,设置常量比特率并向上调整是产生与大型源文件几乎无法区分的结果的关键。当与其他关键参数配对时,恒定的比特率与对高质量输出的两通编码一样有效,并且比两次传递快得多。

也许看上去有悖常理,但一台电脑运行在所有线程上,全油门,编码一个视频不会给你最好的结果。一些研究人员已经证明,如果所有cpu线程都在进行编码,那么质量实际上会下降;更好的做法是使用更少的线程,甚至用第三方应用程序控制ffmpeg (根据我的经验,编码不会明显减慢)。因此,限制线程在较新的多线程桌面和笔记本电脑。

目标比特率的常见做法(在亚马逊的Netflix上看到)自然会因分辨率而异:1080便士至少5000 720p,720便士3500 720p。为了显着地提高视频质量,编码器比特率应该设置为至少1.5倍于那些常用的比特率:即1080 p的7,500倍,720 p的5,250倍。同样,对于4K GoPros或破折号凸轮。

我经常使用我的模糊库中的大型电影文件,并创建大小相当于原版的1/3到1/2的精简版本(20G原始文件让位给8-10 of的文件,质量不会明显下降。还有:框架。从源文件到精简文件维护相同的框架是必不可少的,因此参数很重要。框架是24 for,25 for,或30 for的戏剧电影,欧洲电视,北美电视,分别。(除了把胶片转到电视屏幕上外,在大多数情况下,24 most变成23.976fps。)当然,60 for对于类似GoPro的相机来说是常见的,但是在这里,30 for是一个合理的选择。

正是这种对帧率和比特率的控制使ffmpeg受到控制,并给出了可预测的、可重复的结果。不是一个错误的、巨大的文件,它比您可能开始使用的文件要大。

我在Mac上工作,所以命令行上可能会有细微的差异,这里我使用VideoToolbox作为软件编码器,但典型的命令如下:

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

Stack Overflow用户

发布于 2021-01-04 19:38:56

除了llogan的回答之外,我建议将“实时”属性设置为零(这可以提高运动场景的质量)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63460919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档