让ffmpeg支持10bit编码

文章版权由做者柯O德尔和博客园共有,请尊重并支持原创,若转载请于明显处标明出处:http://www.cnblogs.com/koder/linux

 

最近由于工做须要,要进行265 10bit编码,因而从ffmpeg官网下载了最新版的32位的ffmpeg可执行程序,使用以下命令进行编码:vim

ffmpeg.exe -i input.ts -vcodec libx265 -pix_fmt yuv420p10le -acodec copy output.ts

获得了一个很蒙蔽的结果:windows

注意看黄色这一行,说的是ffmpeg不支持yuv420p10le像素格式,自动切换为yuv420p进行编码,可是yuv420p编出来位深度只有8bit,我去,难道最新版本的ffmpeg不支持10bit编码?ui

 

因而不死心啊,而后各类百度谷歌,最后从国外的一个问答网址上看到有个国外友人说那是由于你用的ffmpeg自带的x265编码器不支持10bit编码,恍然大悟,从上面x265编码器输出的信息中也能看出来是只支持8bit编码的,那么解决办法就是本身编译一个支持10bit的x265库,而后再集成到ffmepg里面去,等于说要本身从新编译ffmpeg哦,编译过的同窗应该都知道这是极其痛苦的事情,可是为了革命,没办法啊,那么就来吧,这里介绍linux下面的操做:this

1. 编译支持10bit的x265库:编码

从官网下载源码包:https://bitbucket.org/multicoreware/x265/wiki/Homespa

要让x265支持10bit编码,只须要修改CMake的一个编译选项便可:code

tar -zxvf x265_2.3.tar.gz
cd x265_2.3/source
vim CMakeLists.txt

 把option(HIGH_BIT_DEPTH "Store pixel samples as 16bit values (Main10/Main12)" OFF)修改成option(HIGH_BIT_DEPTH "Store pixel samples as 16bit values (Main10/Main12)" ON)便可;blog

最后执行CMake编译便可:ci

cd x265_2.3/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/x265_10bit -DENABLE_SHARED=OFF ../../source make -j4 make install

检验是不是真的支持10bit:

cd /usr/local/x265_10bit/bin
./x265 --help

输出信息以下:

x265 [info]: HEVC encoder version 2.3
x265 [info]: build info [Linux][GCC 4.4.7][64 bit] 10bit

说明支持10bit编码了。

2. 把新编译的支持10bit编码的x265库集成到ffmpeg中:

这就是本身编译ffmpeg的过程,能够参考网上的例子,这里重点是介绍编译支持10bit编码的x265,就再也不说明了。

 

注意事项:

1. 在修改x265的CMakeList时,发现了这么一行说明:

# NOTE: We only officially support high-bit-depth compiles of x265
# on 64bit architectures. Main10 plus large resolution plus slow
# preset plus 32bit address space usually means malloc failure. You
# can disable this if(X64) check if you desparately need a 32bit
# build with 10bit/12bit support, but this violates the "shrink wrap
# license" so to speak. If it breaks you get to keep both halves.
# You will need to disable assembly manually.
说明要使用x265进行10bit编码须要在64位的机子上运行,32位的不行哦;

2. ffmpeg官网上的windows编译好的版本,无论是最新的32位仍是64位版本,默认只支持8bit编码,因此要进行10bit编码只能按照上面的方法对x265从新编译,而后再集成到ffmpeg里面。

相关文章
相关标签/搜索