使用ffmpeg转换视频位深


最近使用达芬奇来剪辑视频,发现10bits的h264视频无法导入,或者导入没有画面只有声音根本识别不到视频流的内容,折腾了很久才确定是10bits的关系。利用ffmpeg将视频位深从10bits降低至8bits成功导入。下面来说说如何将10bits视频转换成8bits


ffmpeg里面yuv的格式定义了很多种,比如下面:

1.PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian 
2.PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian 
3.PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian 
4.PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian 
5.PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian 
6.PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian 
7.PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian 
8.PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian 
9.PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian 
10.PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian 
11.PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian 
12.PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian 


下面来详细说明

1.打开CMD

打开CMD

2.使用查看命令

进入到视频文件所在的目录,这里我要用视频文件在E:\迅雷下载[Liuyun&VCB-S&ANK-Raws] Kill la Kill [Hi10p_1080p],所以在CMD中输入命令:cd E:\迅雷下载\[Liuyun&VCB-S&ANK-Raws] Kill la Kill [Hi10p_1080p] 回车之后:切换CMD目录

现在可以先用ffprobe命令查看一下视频文件的信息,命令是:ffprobe "文件名"或者:ffmpeg -i "文件名"比如我要查看kill la kill.mp4的信息可以输入:ffprobe "kill la kill.mp4"文件名要用英文的引号括起来防止出错。一定要确保命令行所在目录与视频文件目录一致,否则会报错找不到文件。命令行

如果命令行与视频文件目录不一致的话,可以把上述命令中的文件名替换成文件路径,比如E:\迅雷下载\[Liuyun&VCB-S&ANK-Raws] Kill la Kill [Hi10p_1080p]\kill la kill.mp4文件名替换成路径

输入命令之后会看到这样的信息:输入命令之后可以看到Video:h264(High 10)视频编解码器为h264的第10部分。yuv420p10le:色彩空间为yuv,色度抽样4:2:0,扫描方式:p:逐行扫描,位深:10bitsle:little endian,分辨率1920×1080,比特率4745kb/s,帧率23.98fps,音频编解码器为aac,封装格式mp4a等等……有用的信息非常多,这里就不一一列举了。

3.使用命令来更改视频的位深,10bits转换至8bits。

接下来使用命令-pix_fmt yuv *来设置YUV格式,“*”星号代表上述列表中yuv后面所带的参数,比如:422p8be,而要转换成8bits可以直接输入yuv420p。所以命令是:ffmpeg -i "要转换的视频文件名" -pix_fmt yuv420p "输出的文件名"需要注意每个参数之间都要有一个空格。输完命令之后回车。

正在转码 转码完成

现在我们再用ffprobe命令查看一下:转码完成之后ffprobe查看 可以看到这里只显示yuv420p了没有了后面的10le,已经转换成功了,默认的yuv420p只有8bits。那么,到这里就结束了。

值得一提的是10bits转换8bits会损失相当一部分画质。

PS.最后经过测试发现达芬奇个人免费版相较于*studio**版本阉割***了部分功能导致无法解码10bits、高质量h264、h265。

达芬奇界面