【BIGTREETECH CB1】搭建视频转码服务器
[复制链接]
随着互联网技术的发展和通讯带宽的提高,人们对视频的清晰度要求越来越高,前几年1080P分辨率的电影是主流,最近几年4K分辨率的视频越来越多,编码方式由主流的H.264到了现在的H.265,但是现在4K分辨率的H.265的影片对于几年前的硬件设备却是一个挑战,处理器速度不足,没有H.265硬件解码器是主要的问题,我的电脑是10年前的Intel 二代I3的CPU,没有硬解H.265的功能,是H.265编码的电影,1080P的影片勉强可以观看,但是4K下就非常卡顿,这就让我有了搭建一个视频转码服务器的想法。
这个视频转码服务器要完成3个功能
1,更改视频编码格式,主要是H.265或其他格式改到H.264。
2,更改视频分辨率,将一些4K的视频改到1080P或更小的分辨率。
3,提取视频内的声音文件。
H.264和H.265介绍(摘自网络)
H.264是一种高度压缩的数字视频编解码器标准,具有低码率,高质量,高容错能力,网络适应性强等特点。
H.265(HEVC,高效率视频编码),是新一代视频编码技术。它围绕现有视频编码标准H.264,保留原来的某些技术,对一些技术进行了改进,同样质量的视频存储空间只需要H.264的一半。H.265带来了高于H.264的压缩率,也带来了高于H.264数倍的解码难度,算法复杂度相比H.264提高了2-10倍,复杂的运算对处理器运算速度有很高的要求。
软件的选择:
软件我选择大名鼎鼎的FFmpeg,以下介绍摘自网络。
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。具有视频采集、视频格式转换、视频抓图、给视频加水印等功能。
FFmpeg的几个主要用途:
视频处理
FFmpeg可以用于各种视频处理任务,比如去噪、模糊视频、色彩转换,视频旋转、提取帧、缩放视频尺寸等。
视频压缩
FFmpeg 包含为各种编解码器[如 JPEG、MPEG-1/2/4、H263+AAC (MPEG)、Theora (Ogg Vorbis)、AVS+、VP8 (WebM)、H.264/AVC、HEVC、AV1 等]提供接口的库,你可以根据需要使用它们来压缩、转码或解码视频。
支持视频打包
对于OTT系统厂商和开发者来说,FFmpeg还完全支持使用HLS和MPEG-DASH打包视频,它还可以配置为使用RTMP或其他协议来传输视频。
支持音频、视频容器格式
FFmpeg同样广泛支持各种容器格式,可以用来读、写及转换各种容器格式,比如avi、mp4、mp3、wma、wav、ts、flv、mkv以及许多其他未知格式。
安装
使用命令sudo apt-get install ffmpeg安装
发现系统自带,都已经按照好了。
安装完成后,可输入以下命令查看安装是否成功
ffmpeg -version
显示所有编解码器ffmpeg -codecs
该命令可以打印出所有可用的编解码器,并显示每个编解码器对应的功能信息,比如是否支持解码或编码。此外,如以下输出结果所示,打印出来的信息还会按照首字母顺序标注出每个编码器和解码器的位置。
biqu@Hurakan:/$ ffmpeg -codecs
Codecs:
D..... = Decoding supported
.E.... = Encoding supported
..V... = Video codec
..A... = Audio codec
..S... = Subtitle codec
...I.. = Intra frame-only codec
....L. = Lossy compression
.....S = Lossless compression
-------
会显示出版本信息,编译器信息,各种配置信息,还有各种库的信息。
Codecs:代表的含义是:
D..... = Decoding supported 支持解码
.E.... = Encoding supported 支持编码
..V... = Video codec 视频编解码器
..A... = Audio codec 音频编解码器
..S... = Subtitle codec 字幕编解码器
...I.. = Intra frame-only codec 仅限帧内编解码器
....L. = Lossy compression 有损压缩
.....S = Lossless compression 无损压缩
类似的命令还有:
显示所有编码器ffmpeg -encoders
显示所有解码器ffmpeg -decoders
我截取了一段某连续剧20秒的片段,这个连续剧我在的电脑上是无法流畅播放的。
视频是HEVC(H.265)编码,3840*1620的分辨率,60帧率。
在linux下可以使用ffmpeg带的ffprobe命令来查看流媒体各种信息。
ffprobe pingfan20s.mp4
1,视频格式和分辨率转换
3840*1620分辨率的H.265视频我要转换成1080P以下H.264格式。
为了不改变电影的长宽比,我将输入视频成比例缩小为源视频一半大小,也就是宽和高都是原来的一半,那就加入命令scale=iw/2:ih/2,还得加入命令-max_muxing_queue_size 512,要不然报错“Too many packets buffered for output stream 0:1”,还得加入-threads 2要不然开发板的CPU在视频转换时满负荷会死机,最后得到的命令就是
ffmpeg -threads 2 -i pingfan20s.mp4 -max_muxing_queue_size 512 -vf scale=iw/2:ih/2 -vcodec h264 ok.mp4
经过10多分钟漫长的等待,终于转换完了,视频的编码由H.265转换为H.264,分辨率也由3840*1620变为1920*810,帧率还是60帧没有变,我的老电脑可以流畅播放了。
2,提取视频内的声音文件
输入命令,声音文件的提取还是很快的。
ffmpeg -i pingfan20s.mp4 -vcodec copy -vn out.mp3
总结:
这次搭建的视频转换服务器和自己当初想象的有些不同,没想到视频转换居然这么依赖CPU的性能,需要这么长的转换时间,这次的H.265转H.264,4K转2K,60帧的电影,大约需要40倍的影片时长,也就是说,一个小时的电影,我大约需要40个小时才能转换完,好在开发板功耗才几瓦,如果不着急可以慢慢等,但是提取视频内的声音文件还是很快的,只需要六分之一的影片时间。这次试验也让我了解到ffmpeg这个软件的功能强大,如果配合高性能的CPU(比如Intel的i9系列)会有惊人的表现。
|