技术解析

Mac 上面已经安装了 x264 和 x265,但是用 ffmpeg,选 x264 和 x265 做解码器的时候找不到,怎么解决
0
2021-06-07 06:14:47
idczone

电脑上面已经安装了 x264 和 x265

brew install x264
Warning: x264 r3048 is already installed and up-to-date.
To reinstall r3048, run:
  brew reinstall x264

brew install x265
Warning: x265 3.5 is already installed and up-to-date.
To reinstall 3.5, run:
  brew reinstall x265

但美国服务器是在 ffmpeg 中使用的时候,提示 Unknown decoder 'x265'(最后一行):

ffmpeg \
-c:v x265 -i  ./A.mp4 \
-c:v x265 -i ./B.mp4 \
-filter_complex "[0:v]pad=iw*2:ih[v_wide];[v_wide][1:v]overlay=W/2:0[out_video]" \
-map "[out_video]" \
-c:v x265 \
-crf 18 \
-map 0:a:0 \
-c:a copy -y \
./C.mp4
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.21)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.2-with-options_1 --enable-shared --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libaom --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-demuxer=dash --disable-libjack --disable-indev=jack --enable-opencl --enable-videotoolbox --disable-htmlpages
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Unknown decoder 'x265'

ffmpeg 的安装方式是homebrew-ffmpeg

我是直接

brew tap homebrew-ffmpeg/ffmpeg
brew install homebrew-ffmpeg/ffmpeg/ffmpeg

安装的,github 页面也说了默认已经包括了 x264 和 x265

fA8YHdtNv6FVkuz


我最开始的使用用的是苹果自带的 videotoolbox,但是发现那个输出视频的时候画质损耗比较大,就想改用 libx265


libx265

这个也试过,没用

我用的 https://evermeet.cx/ffmpeg/ 这里下的静态链接版 , 看-encoder 有 libx265 要不要试一下

decoder ? x265 怎么会是 decoder 呢,它是 encoder 啊。转码的话,你要这么用 ffmpeg -i input -c:v libx265 output,会先调用软解解码器,然后再用 x265 编码器进行编码。videotoolbox 你可以这么用,是因为它既可以解码又可以编码

参数顺序问题吧,-c:v 放-i 后面(而且你重复了)

emmm 我是在网上 copy 的,不太懂视频处理的原理。
可以先用 videotoolbox 解码然后用 x265 编码吗(不同的库解码的结果是通用的吗?)

你已经用 videotoolbox 压过那画质就没有原来好了,你再用 x265 最多也就 videotoolbox 输出这画质

我的意思是源视频不变,先用 videotoolbox 解码,然后用 x265 来输出,因为我看 videotoolbox 有硬件加速

使用命令行:
ffmpeg.exe -v 0 -codecs | grep 265
查看支持的 codec 里是否有 h265 的。
我的 win 4.2.1 static 的返回:
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv )
说明支持 Decode 和 Encode,
其中 decoders 支持:hevc hevc_qsv hevc_cuvid
encoders 支持: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv
另:-c:v xxx -i xxx 表示这个输入文件的视频解码器用指定的 xxx,但是你的 ffmpeg 不支持,所以提示的是“Unknown decoder”而不是“Unknown encoder”
ffmpeg 建议用 static 编译的,免去依赖的问题。

原视频是什么?一个视频文件吗?那就 ffmpeg 里-i 指定,或者如果他已经是 h.265 的视频,那只要重新转换格式就行了,-vocodec copy 。
你用 ffmpeg 的话看下有哪些解码器,有没有硬件解码器。
你用苹果工具解码的话就存成 raw 格式再 ffmepg -c libx265 转

可以用 videotoolbox 解码然后用 x265 编码。解码理论上不应有差别

因为 -c:v (等价于-vcodec) 用的值是 libx264 和 libx265 。
ffmpeg 默认动态链接 libx264,brew 应该是自动安装这个依赖的,brew install x264 装的是另一个只能处理 h264 的命令行工具 x264 。
运行 ffmpeg -codecs 可以看到支持的 encoder/decoder 的名字,如果直接用 h264 或者 hevc 默认就是选择 libx264 和 libx265 。
你这里-i 前面的-c:v 是多余的
这里用了 filters,必须重编码的。

-crf 参数我一般不写默认 28 质量,越小质量越好但是视觉上 28 已经和原视频差不多,速度参数一般我写 faster 这个速度比较平衡不然就太慢了接受不了,
音频参数-c:a copy 直接复制原视频,我测试了结果如果用-c:a aac -b:a 128k 文件反而更大一些。
ffmpeg -i input.mp4 -c:v libx265 -crf 26 -preset faster -c:a aac -b:a 128k output.mp4
所以我一般用这个
ffmpeg -i input.mp4 -c:v libx265 -preset faster -c:a copy output.mp4
参考: https://trac.ffmpeg.org/wiki/Encode/H.265


ffmpeg -v 0 -codecs | grep 265
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (encoders: libx265 hevc_videotoolbox )
ffmpeg -v 0 -codecs | grep 264
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (encoders: libx264 libx264rgb h264_videotoolbox )
不知道为啥我这里的 h264 和 h265 都只能编码不能解码。。。。

具体原因我也不是很懂,还是建议下载静态编译的二进制文件。楼上已经给出链接 https://evermeet.cx/ffmpeg/

x265 就是用 CPU 的。你要用硬件编码器那就改用硬件编码器。
「显卡加速」有,但因为显卡并没有比 CPU 快多少,所以实际上并不能加速,也没人用。
要么就直接用显卡内部的硬件编码器来编码。这种和加速无关,是直接调用专门的电路来编码。
比如 qsv 或者 nvenc,就是调用核显或者独显内部的电路来编码的。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服