17| 如何用软件编码器来编码 H264 ?
展晓凯
你好,我是展晓凯。今天我们来一起学习使用软件编码器来编码 H264 的方法。
上一节课我们学习了视频编码的基础知识,重点讲解了 H264 编码中的基本概念。在了解了视频编码和 H264 编码的基础知识之后,这节课我们就可以基于 FFmpeg 来书写一个编码 H264 的工具类,把摄像头采集下来的 YUV 数据编码成可播放的 H264 码流。
在移动平台上只要兼容性没有问题、清晰度相差不大,性能肯定是第一个要考虑的因素。iOS 平台,因为硬件编码器的兼容性比较好,基本上用不到 libx264 这些软件编码器,所以这节课的实例只需要运行在 Android 平台上,结构图也会以 Android 平台为基础进行绘制。不过编码部分的代码都是使用 C++ 来书写的,是跨平台的。如果你在 iOS 平台有需要的话,可以直接使用这个工具类。这个工具类的输入是一张纹理,输出是 H264 的裸流,接下来我们开始学习吧。
编码适配器
编码模块的输入我们上一节课讲过,就是摄像头预览控制器中渲染到屏幕上的纹理 ID。因为下节课我们还会学习各平台硬件编码器的使用,所以这节课我们会把重点放到软件编码器上。首先抽象出一个接口,基于这个接口,我们会有一个软件编码器的实现和一个硬件编码器的实现。在摄像头预览的控制器里是怎么和编码器模块交互的?我们一起来看下。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了使用软件编码器编码H264的方法,重点介绍了视频编码的基础知识和H264编码的基本概念。文章详细讲解了编码适配器的初始化、创建编码器接口、编码接口以及销毁接口,以及软件编码适配器的整体结构和内部实现,包括视频队列和编码线程的实现。此外,还介绍了纹理拷贝线程的作用和实现细节,以及优化显存到内存的数据转换方法。最后,文章介绍了VideoX264Encoder类的初始化、编码和销毁接口的实现,以及通过具体的代码和实现细节深入浅出地介绍了软件编码器的工作原理和实现方法。这篇文章对于想要学习软件编码器的读者具有很高的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》,新⼈⾸单¥59
《快手 · 移动端音视频开发实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- peter请教老师几个问题: Q1:实现硬件编码器,是模拟硬件编码吗? 文中提到“基于这个接口,我们会有一个软件编码器的实现和一个硬件编码器的实现”, 硬件编码是由硬件实现,不需要实现啊。这里是指模拟硬件吗? Q2:编码线程和纹理拷贝线程有同步、通信关系吗? Q3:“纹理拷贝线程”的一个功能是“建立OpenGL线程”,是两个线程吗? 理解1:一个线程,“建立OpenGL线程”就是建立“纹理拷贝线程”。 理解2:两个线程,“纹理拷贝线程”是一个线程,该线程会创建另外一个“OpenGL线程”。 Q4:“OpenGL线程”是特殊的与OpenGL相关的线程吗? 理解1:就是普通线程,其作用是执行OpenGL操作。 理解2:与OpenGL库有关,需要调用OpenGL库来创建该线程。 Q4:视频队列是用Android SDK的队列吗?还是自己写的队列? Q5:离屏渲染的Surface是Java层的还是Native层的? Q6:“YUY2”是笔误吗?应该是“YUV2”吧。 Q7:最后写入的h264文件,是二进制文件吗?
作者回复: A1:这里的意思是硬件编码适配器的子类,里面会调用系统提供的硬件编码接口; A2:纹理拷贝线程就是拉取硬件编码H264数据的线程,这个线程和预览线程是有同步关系的; A3:一个线程的理解是对的; A4: 普通线程,然后会绑定OpenGL上线文,这个线程一般被称为OpenGL 线程; A4-2: 自己实现的队列; A5: Native层构建的PbufferSurface A6:不是笔误,就是YUY2格式,代表的是YUV422格式; A7: 是二进制文件的,属于Annex-b格式;
2022-08-31归属地:北京 - xueerfei007老师您好,我最近在使用ffmpeg编码工业相机sdk提供的raw帧数据。目前编码后,视频的时间与原始视频流对不上,编码长度比录制时长多了一倍。猜测可能与pts/dts的设置有关。这个需要如何设置,或者有什么方法定位到问题的具体原因?2023-08-05归属地:浙江
收起评论