【显示技术
来源:互联网 发布:数据管理员 编辑:程序博客网 时间:2024/06/05 14:27
最近在搞的一个项目,使用硬件加速,代替软件x265库进行H.265编码,好听点的叫法就是异构。
作为软件工程师,硬件算法的实现基本就和本人无关了,不过好在这块本身也不是兴趣所在~~ 为了更好地讲硬件加速的效果进行展示,也为了省去许多工作,因此选用FFMPEG作为数据输入与输出的框架。
关于FFMPEG,网上资料也很多,雷神的博客也介绍得比较到位了,雷神侧重于讲解FFMPEG本身的代码框架及原理,这里的切入点不太一样,应用场景不同。
下面是主题。。
第一步,搞清楚FFMPEG框架能够完成的工作及特性
1. 修改点
仿照 libavcodec/libx265.c 写一个libh265.c,实现几个接口即可,没错,就是这么简单。。
init
close
encode2
libx265的结构体实现如下:
AVCodec ff_libx265_encoder = { .name = "libx265", .long_name = NULL_IF_CONFIG_SMALL("libx265 H.265 / HEVC"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_HEVC, .init = libx265_encode_init, .encode2 = libx265_encode_frame, .close = libx265_encode_close, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,};
事实上,init 和close就是一些初始化,关键就是实现encode2
2. FFMPEG框架本身具有诸多功能,能帮助读取数据,送到encode2进行编码(接收编码后的数据也在该接口完成),编码完成后还能将编码后数据进行封装、发送等
3. 借用一下libx265的代码说一下该encode2接口的特性及在该接口中我们需要完成的工作
static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic, int *got_packet)
数据一帧一帧地从文件或其他源读入之后,信息存在AVFrame中传入(每次传入一帧,或者当数据下发完毕,发送完毕,纯接收数据时,该参数传入NULL),正常关心该结构中的几个成员即可:
data 指向数据
width/height 视频分辨率
pts 帧序号
接口中必需完成的工作:
1. 数据发送到编码器进行编码,软件直接调用编码库接口编码,硬件通过驱动发送数据
2. 检查回收结果,两种情况:
a. 无结果,上一次编码还没完成,我们不必傻乎乎等着,直接返回0,将got_packet 设0返回即可,FFMPEG自己会记录发送的包数量与接收的包数量,没收完全,它后面会传入 AVFrame 参数NULL来接收结果。
b. 有结果,可能是上次结果(正常都是如此,毕竟编码比数据读入慢多了),创建一个packet,将结果存入,结果信息记录在 AVPacket参数中返回
创建packet接口:
ff_alloc_packet(pkt, payload);将编码后数据拷贝到创建的packet中去
设置AVPacket信息,设置pts/dts
更新got_packet 的值并返回
3. 利用FFMPEG实现基本功能,实现以上接口实现就已经完成了,下面说几个在学习过程中的实验及发现。
4. FFMPEG多线程
多线程有两种形式
第一种,x265软件编码多线程,该多线程参数由FFMPEG带入,
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
例如两条frame处理的线程:
ffmpeg -i xxx -threads 2 -thread_type frame xxx
该参数会通过avctx参数带入到编码接口中,告诉软件编码器应当用几个线程进行并行编码,不设置的情况下默认是有多少个核开多少个线程
第二种,FFMPEG数据读取、调用encode2编码、收数据多线程:
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_INTRA_ONLY,
会开启多个线程,并行读取数据,调用encode2接口进行编码、收数据
- 【显示技术
- MFC全屏显示技术
- 视频渲染(显示)技术
- Mirasol显示技术
- 3D显示技术
- 视网膜显示技术
- 3D显示技术
- 显示技术名称
- 3D显示技术
- echart 图表显示技术
- 常用显示接口技术
- 显示技术介绍(3)_CRT技术
- 位图显示和图形界面技术(操作系统桌面显示技术)
- Jsp中的分页显示技术
- Web显示层技术评估
- 真正的立体显示技术
- Web显示层技术评估
- Web显示层技术评估
- 网络编程-网路七层协议图
- 磁盘管理--LVM
- 关键字
- (转)暴涨、闪崩、分叉,监管,现在是投资机会?
- 使用JDK开发一个简单的WebService
- 【显示技术
- Linux创建root权限用户、禁用root登录
- LeetCode Graph:M133_Clone_Graph
- 工作笔记(五)
- JAVA语句学习(三)
- 20170804
- android客户端与服务器socket通信实例
- 获取本地项目
- LeetCode 108 Convert Sorted Array to Binary Search Tree