微信公众号怎么做网站链接,网站建设需要什么流程图,网站备案才能使用,酒店网站建设与设计公司大家好#xff0c;欢迎来到停止重构的频道。 
本期我们讨论音视频文件转编码#xff0c;如将视频H264转H265等。 
内容中所提及的代码都会放在GitHub#xff0c;感兴趣的小伙伴可以到GitHub下载。 
我们按这样的顺序展开讨论#xff1a; 
1、  编码的作用  
2、  转编码的… 
大家好欢迎来到停止重构的频道。 
本期我们讨论音视频文件转编码如将视频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容器。