【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

大家好,欢迎来到停止重构的频道。

本期我们讨论音视频文件转编码,如将视频H264转H265等。

内容中所提及的代码都会放在GitHub,感兴趣的小伙伴可以到GitHub下载。

我们按这样的顺序展开讨论:​

1、 编码的作用

2、 转编码的工作原理

3、 编解码器安装

4、 示例代码讲解

编码的作用

在前面《音视频转码工作原理》中讨论过,一个视频文件 实质上是分3层 的,封装、编码、基础数据

编码的作用是为了压缩数据,限制最终文件的大小。

选择不同的编码格式 ,更多是为了节省更多的存储空间 ,或者为了扩大客户端的播放兼容性

这里值得一提的是,编码是需要区分音频和视频的,视频的编码器是不能压缩音频数据的,反之亦然。​

关于H264等视频编码格式的详细说明,可参考往期《H264》。

关AAC等音频编码格式的详细说明,可参考往期《AAC》

转编码的工作原理

整个转编码 的过程是 解封装>>解码>>编码>>封装

将解封装后的数据块放到对应的解码器 中,即可解压缩成原始的视频帧、音频帧。

将原始帧放入目标编码器 中,即可压缩出对应编码格式的数据块。

其中一个数据块不一定是完整的一帧数据 一些封装格式,可能几个数据块才能组成完整的一帧数据。

整个过程是流式的,循环往复,直到处理完成。

这里需要特别说明的是,编码器、解码器都是对应编码格式的 ,是特定的算法程序,是现成的

如h264转h265,则解码器使用h264的,编码器使用h265的。

如果是直播的场景,可以选择在封装前加上时间间隔,请参考往期《重封装》, 本期不作赘述。

补充说明一下,转编码实际上只是换了一种编码格式 ,可以对编码器设置诸如码率等影响压缩效率的参数 ,也可以设置诸如去除B帧等编码格式特有的参数

但是想要改变分辨率、帧率、采样率等参数 的话,则需要对原始帧数据进行处理才行,关于这部分的详细说明,请关注下一期内容。

编解码器安装

FFmpeg默认情况下会包含一些编解码器,可以使用命令查看FFmpeg支持的编解码器。

如果需要对FFmpeg扩展编解码器的话,则需要先安装对应的编码器/解码器程序,然后修改FFmpeg编译配置,并重新编译安装即可。

关于FFmpeg更详细的说明,可参考往期《FFmpeg》。

示例代码讲解

转编码的示例代码为trancode.cpp ,示例代码是H264转H265的。

原来转封装示例代码基础上 ,增加了初始、关闭编解码器 ,循环处理数据中加入了解码、编码过程

在设置解码器/编码器timebase时,FFmpeg推荐设置为帧率的倒数,但按我们的经验,这样会有很多问题,所以我们更推荐设置为统一的timebase

在转编码过程中,需要在解码前、编码后,做一下timebase转换 ,才能保证视频播放时不会过快或过慢。

在编码/解码时,需要区分音频/视频 ,将数据 放到对应的编解码器

另外,编码/解码实质上是异步的,所以程序需要判断是否取出数据再进行下一步。

而且因为编解码异步处理的原因,且解编码是需要花费一定时间的,所以在读取完视频文件 时 ,编解码器可能还存在未处理完的数据

所以在读出完视频文件后,还需要等待编解码器处理完所有的数据才算处理结束。

总结

本期内容的代码已经上传Github,需要的朋友可以下载。

以上代码讲解只提及了重要的部分,代码中含有更详细的注释说明,里面有编译运行环境的搭建说明,也提供了做好的docker容器。

相关推荐
岁月小龙8 小时前
如何让ffmpeg运行时从当前目录加载库,而不是从/lib64
ffmpeg·origin·ffprobe·rpath
行者记2 天前
ffmpeg命令——从wireshark包中的rtp包中分离h264
测试工具·ffmpeg·wireshark
EasyCVR2 天前
国标GB28181视频平台EasyCVR私有化视频平台工地防盗视频监控系统方案
运维·科技·ffmpeg·音视频·1024程序员节·监控视频接入
hypoqqq2 天前
使用ffmpeg播放rtsp视频流
ffmpeg
cuijiecheng20182 天前
音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现
ffmpeg·音视频
QMCY_jason2 天前
黑豹X2 armbian 编译rkmpp ffmpeg 实现CPU视频转码
ffmpeg
苍天饶过谁?2 天前
SDL基本使用
ffmpeg
HZ355722 天前
ffmpeg视频解码
ffmpeg·音视频
runing_an_min2 天前
windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576
c++·windows·ffmpeg·e0029
EelBarb2 天前
ffmpeg:视频字幕嵌入(GPU加速)
ffmpeg·音视频