QT+FFmpeg+OpenGL-Shader实现视频播放器

一、项目功能展示模块。
初始运行界面
QT+FFmpeg+OpenGL-Shader实现视频播放器_第1张图片打开文件进行播放:
QT+FFmpeg+OpenGL-Shader实现视频播放器_第2张图片快进
暂停/播放功能
在播放过程中继续打开其他文件播放
QT+FFmpeg+OpenGL-Shader实现视频播放器_第3张图片等全屏功能。

二、项目架构
本项目分为几大模块:
打开获取视频信息模块、解封装解码模块、音频解码模块、视频解码模块、音频播放模块、视频播放模块、视频图像渲染模块、显示界面模块。

三、项目实现思路。
1.打开文件,进行解封装。创建解封装上下文AVFormatContext
调用avformat_open_input函数进行初始化解封装上下文。
通过av_find_best_stream找到音视频流下标。从而找到音视频流。进而获取音视频流的属性,AVStream *stream->codecpar中成员。

2.进行解码
.先找到解码器 avcodec_find_decoder()函数.
.然后创建解码器上下文 AVCodecContex 通过avcodec_alloc_context3(AVCodecContex*)
.然后通过avcodec_parameters_to_context(AVCodecContex*,AVCodecParameters *para)进行配置解码器上下文参数,AVCodecParameters para由解封装上下文获取fmt_ctx->streams[videoStream]->codecpar
.打开解码器上下文 int re .然后通过avcodec_parameters_to_context(AVCodecContex
,AVCodecParameters *para)进行配置解码器上下文参数,AVCodecParameters *para由解封装上下文获取fmt_ctx->streams[videoStream]->codecpar
.打开解码器上下文 int re = avcodec_open2(codectx, 0, 0);
最后开始解码
avcodec_send_packet
avcodec_receive_frame
对应上述两个函数,发送一个AVPacket,接收一个AVFrame。解码出一帧数据。

3.上述解码接口已经完成,之后需要开始进行项目设计。对于音频视频应该对应两个线程,音频解码线程与视频解码线程。并且需要一个总的线程来启动这两个线程。这里线程使用的是QThread
在总线程中,先读取一帧数据,判断是音频还是视频数据,如果是音频视频则放入到视频线程中进行解码,若果是音频数据则放入音频线程进行音频重采样。
这个其中两个线程都有设置一个AVPacket的list,来存放缓存,这里设置为100,每次线程从其中list取出一帧数据进行解码,在ffmpeg中一次Send需要对应多次Recv。
在音频线程中,则进行解码然后对一帧数据进行音频重采样
。此处我们只对样本输出格式进行了转换为AV_SAMPLE_FMT_S16。

4.对于已经解码后的YUV数据,我们需要转换成RGB进行显示,因为计算机只能识别Rgb三原色进行显示,这里我们使用shader代码进行显示。
if (width == frame->linesize[0])
{
//无需对其,已经对齐
memcpy(datas[0], frame->data[0], frame->width * frame->height);
memcpy(datas[1], frame->data[1], frame->width * frame->height / 4);
memcpy(datas[2], frame->data[2], frame->width * frame->height / 4);
}
else
{
//行对齐 Y U V
for (int i = 0; i < height; i++)
memcpy(datas[0] + width * i, frame->data[0] + frame->linesize[0] * i, width);

	for (int i = 0; i < height/2; i++)
		memcpy(datas[1] + width/2 * i, frame->data[1] + frame->linesize[1] * i, width);

	for (int i = 0; i < height/2; i++)
		memcpy(datas[2] + width/2 * i, frame->data[2] + frame->linesize[2] * i, width);
}

5.解码后的音频交给QT自带音频播放进行播放。

6.音视频同步问题。这里选择视频同步音频
7.快进功能,应找到关键帧,这样才能直接快速定位到位置

你可能感兴趣的:(学习)