FFmpeg 状态与质量 / CUDA(CPU / GPU)

3

ffmpeg我用对了吗?

自从我在家庭Web服务器上使用ffmpeg转换剪辑以来,已经过去了很长时间,现在mp4(h264和aac)是当前的总体标准(适用于所有游戏机、智能手机、智能电视、个人电脑),所以我决定将我的旧剪辑从各种数码相机转换为这种新容器/编解码器。

  1. 更小的空间和相同的质量。
  2. 兼容性
  3. 支持标签(mac的subler)

经过一些研究,我选择了ffmpeg,因为有各种原因:

  1. 命令行(我使用默认设置创建了简单的Web界面,使用php的exec执行)
  2. 质量/大小比例

我读到许多昂贵的视频转换软件无法正确处理低比特率视频。我也测试了其中一些,并且个人无法找到合适的导出设置或者对结果不满意......其中一些具有固定的默认导出设置,大多数在相同文件大小下会降低视频质量。 ffmpeg允许我设置-crf(通常为18-24)和-preset(veryslow、fast..),这使我可以在保持相同可见质量的前提下大幅减小文件大小。

他说我在使用非常慢的预设(也有安慰剂,但最终的视频文件大小仅减少了1%)。

这是我使用的命令:

ffmpeg
-y //overwrite the file if it exists

-i INPUTFILE // replace with the input file

-metadata title=THETITLE // set a nice title, visible on modern devices
-metadata date=THEDATE // set a nice title, visible on modern devices

-c:v libx264 // use the h264 codec
 -crf 21 // try different numbers between 18-26
 -preset veryslow // placebo,slow,fast,ultrafast==big file 
 -tune film // tune it a little
 -pix_fmt yuv420p // preferred on most modern devices
 -profile:v main // preferred on most modern devices
 -level 3.1 // preferred on most modern devices 
 -refs 4 // preferred on most modern devices

-c:a libfdk_aac // use aac
 -metadata:s:a language=eng // set a language, visible on modern devices 
 -b:a 128k // audio bitrate 128k is like mp3 192k
 -ar 48000 // 44100 ... whatever
 -ac 2 // audiochannels
 -movflags +faststart //move the metadata in the front of the video so it loads faster

OUTPUTFILE

一些带有m2ts的摄像机剪辑已经具备了avc/h264兼容编解码器,因此我只需复制流。有些带有ac3/dolby sorround音频。我转换音频但保留ac3作为第二个音轨映射到ffmpeg流中。这使我能够在浏览器和移动设备上观看mp4,但我也能保持环绕声以在某些电视、高级媒体播放器或设备(如Apple TV)上播放。
虽然我对速度(使用四核)很满意,但最近我又读到了有关cuda opencl的内容,还有一个简单的事实,即我没有使用比ffmpeg更多的转换工具,因为用了很长时间了。
使用我所使用的设置,ffmpeg是一个好的转换器,可以保持与源相同的视频质量,同时减少平均30-40%的占用空间吗?
GPU转换真的那么糟糕(测试gtx970的cuda)?通过同时使用GPU和CPU来提高转换速度会很好,但据我理解它们不能一起工作?而且仅使用GPU会严重损失质量... CPU更精确,GPU计算速度更快但不够精确,根据我所读的资料,昂贵的软件仅用于预览目的使用cuda... 对吗?

ffmpeg或其他软件是否兼容CPU + GPU编码?

我真的不记得在哪里看到的了,但我读过ffmpeg不是一个好的视频转换器。

我非常满意尺寸/质量,我平均节省了30%的空间,并且没有明显的质量损失。通过一些额外的参数,我可以调整一些旧的模拟视频,这些视频的去隔行扫描质量非常差。

也许我可以用另一个软件获得更多的尺寸/质量吗?

注意:我喜欢ffmpeg。它是免费的,并且具有命令行,因此我可以使用php html和js创建自己的界面,并在各种设备上使用它而无需在每个设备上安装它。我直接将idevice剪辑上传到ffmpeg服务器。

编辑:

@talonmies ... cuda标签已删除:

http://www.nvidia.com/object/cuda_home_new.html

CUDA®是由NVIDIA发明的并行计算平台和编程模型。它通过利用图形处理单元(GPU)的强大计算能力,实现了计算性能的显著提升。迄今为止,已经销售了数百万支持CUDA的GPU,软件开发人员、科学家和研究人员正在广泛使用CUDA进行GPU计算。以下是一些例子:-更多信息请参见http://www.nvidia.com/object/cuda_home_new.html#sthash.dEYaqae7.dpuf 难道CUDA不是一个理论上应该支持的编程模型,以便处理像GTX 970这样的NVIDIA卡上的GPU编码吗?就像Badaboom软件http://www.geforce.com/games-applications/pc-applications/badaboom-media-converter一样。

对于GPU和CPU,您可以在单独的进程中同时进行。我不使用FFMPEG,但我使用mencoder,它在底层使用FFMPEG,并且我经常同时运行多个实例(我编写了一个简单的前端,使同时启动几个并发转码非常容易。(我使用的mencoder版本比较旧,不支持多线程,现在不确定是否支持,但当我有一堆视频要转码时,我讨厌浪费核心)。因此,我猜您可以从命令行同时执行一个GPU实例和一个CPU实例。 - Pete
抱歉,mencoder 不使用 FFMPEG,我想是这样的。但我认为它们使用相同的底层库。也许就是这样。对不起,我已经很久没有处理除我的前端之外的任何其他东西了。 - Pete
使用ffmpeg,我可以正确地利用所有的核心,在SD上获得约150fps,在HD上获得默认帧数的两倍。但是看起来ffmpeg不支持GPU编码。 - cocco
请使用非常低的预设来完成此操作。 - cocco
是的,Mencoder应该是FFmpeg的替代品,但它真的不支持多线程吗?那将会非常慢。 - cocco
2个回答

2
使用我所使用的设置,FFmpeg能否是一个好的转换器,以保持与源视频相同的视频质量,并将占用的空间减少30-40%左右?
需要考虑许多因素,但作为广义概括,您可能能够实现“视觉上无损或接近无损,但大多数用户无法分辨,但不是技术上无损”的输出,并且该输出文件大小仍然小于输入。从 ~-crf 18 开始,然后逐渐增加,直到达到最高值,同时仍然提供可接受的质量。对于其余的编码过程,请使用该值。
如果速度过慢,请使用更快的 -preset
有关更多信息,请参见FFmpeg Wiki:H.264视频编码指南
FFmpeg或其他软件是否与CPU + GPU编码兼容?
FFmpeg支持nvenc。获取NVIDIA Video Coding SDK,然后使用--enable-nonfree --enable-nvenc编译ffmpeg。当提供类似的质量时,它可能比x264慢,但如果您的CPU已经被占用,则可能会有用。
x264可以支持OpenCL(--opencl选项)进行预测,以及其他一些功能,但可能不值得使用,甚至可能更慢。您只需尝试并比较即可,假设您有兼容的硬件。
声称以某种方式使用“(GP)GPU”的编码器通常比普通x264更慢和/或质量更低。
我读到FFmpeg不是一个好的视频转换器?
没有给出任何理由,听起来像是毫无根据的观点。

“-crf(通常为18-24)”,我已经写明我使用超过18的值,我阅读了FFmpeg编码指南...我想知道是否FFmpeg是唯一一个支持低比特率高质量编码且支持命令行的有效软件(也许支持CUDA)...但感谢您的澄清...所以您确认FFmpeg不会在不久的将来支持CUDA或任何其他GPU编码,同样适用于OpenCL吗? - cocco
@cocco 除了使用 ffmpeg,我没有其他建议,除非你想使用 x264 命令行工具。ffmpeg 中的一些滤镜支持 OpenCL,但其效果有待商榷。虽然没有原生的 OpenCL 编码支持,但这并不意味着你不能通过 libx264 来实现(我从未尝试过)。请参考 x264-params AVoption。 - llogan

0

使用我所使用的设置,ffmpeg是一个好的转换器,可以保持与源相同的视频质量,同时减少平均30-40%的空间占用吗?

通常情况下是这样的,在这种情况下,您正在使用libx264进行视频转换,请尝试并查看。也许尝试不同的-crf值。请记住,此转换[除非crf值非常低]将是有损的。

GPU转换是否不好?这可能不是不好的,具体取决于您如何使用它。据我所知,FFmpeg实际上不支持任何[从命令行]硬件GPU解码/编码。


就像我之前所说的,我对输出结果非常满意。我使用18到24之间的值和预设的veryslow,这可以让我得到一个小文件。我想问一下,FFmpeg是唯一一个在低比特率下拥有高质量编码且支持命令行的有效软件吗?你能否再告诉我一些支持GPU编码的软件呢? - cocco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接