## Qt+ffmpeg+sdl简单播放器
## 2019-2-15
音视频同时播放,暂未进行音视频同步
sdl2声音播放原理见雷神:
https://blog.csdn.net/leixiaohua1020/article/details/40544521
## 2019-2-13
简单视频播放器(直接解码sdl渲染播放)
https://blog.csdn.net/FlayHigherGT/article/details/85690386
#### 基本流程解析:
pFormatCtx = avformat_alloc_context();
首先给上下文分配内存
ret = avformat_open_input(&pFormatCtx, filePath, NULL, NULL);
之后打开媒体文件,这里面应该会将媒体格式信息存储在上下文中
av_dump_format(pFormatCtx, 0, filePath, 0);
这里可以打印出媒体格式的详细信息
ret = avformat_find_stream_info(pFormatCtx, NULL);
在上下文中寻找视频流信息
videoindex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
这里是找到视频流的index标志号
avStream = pFormatCtx->streams[videoindex];
设置avstream这个东西
g_frame_rate = avStream->avg_frame_rate.num / avStream->avg_frame_rate.den;
这里可以设置一下帧率
pCodecCtx = avcodec_alloc_context3(NULL);
这里打开解码器上下文
ret = avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);
将媒体信息的参数传入解码器上下文
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
在解码器上下文中找到解码器
ret = avcodec_open2(pCodecCtx, pCodec, NULL);
打开解码器
screen_w = pCodecCtx->width;
这里可以从解码器上下文中获取到解码视频的宽
screen_h = pCodecCtx->height;
这里可以从解码器上下文中获取到解码视频的高可以给渲染窗口用
packet = av_packet_alloc();
av_init_packet(packet);
分配一下视频一帧的压缩包数据结构,并初始化
pFrame = av_frame_alloc();
分配解码后的一帧数据的数据结构
while(1)
{
//这里是不断读取需要解码的包送到解码器里面
ret = av_read_frame(pFormatCtx, packet); 这里while进行循环读取
1、ret < 0 没有包可以读,可以结束循环
2、ret == 0 && packet->stream_index != videoindex 这里表示没有读取到视频流
3、ret == 0 {//这里表示正常的视频包
avcodec_send_packet(pCodecCtx, packet);//这里发送要解码的数据到解码器上下文中
}else
{
av_packet_unref(packet);// 如果还占用内存则释放
ret = avcodec_send_packet(pCodecCtx, packet);这里如果不是0的话需要刷一个空包进去
}
//这里是读取解码器里面需要解码的包进行解码
do{
ret = avcodec_receive_frame(pCodecCtx, pFrame);
1、ret == 0 表示成功,可以从pFrame中读取到解码帧数据送到渲染器渲染
2、ret == AVERROR(EAGAIN) 说明没有可读的解完的帧数据
3、ret == AVERROR_EOF 说明没有帧了
avcodec_flush_buffers(pCodecCtx);// YUV 1920*1080*1.5*5个buffer 这里需要做一个刷新
}while(ret != AVERROR(EAGAIN))一直读取知道没有可渲染的帧
}
热爱技术。
- 粉丝: 2971
- 资源: 7864
最新资源
- 模块化多电平流器仿真MMC Matlab-Simulink N=22 采用最近电平逼近调制 功率外环 电流内环双闭环控制 电流内环采用PI+前馈解耦,电容电压排序, 并网后可以得到对称的三相电压和三相
- 赛灵思FPGA匹配CMV2000,图纸资料齐全,提供软件代码,PCB等,软件代码附说明,方便读懂
- 171-西门子1200PLC机器人控制程序模板,程序模板清晰明了,容易看懂,有注释,硬件采用1214CPU,触摸屏采用KTP700系列 打开软件采用博图V15.1及以上
- 西南科技大学密码学希尔密码实验
- comsol激光模型整理合集,可提供自己讲解的视频,说明每步操作意义 1.图1-3为激光热应力模型,采用固体力学、固体传热研究激光焊接下材料的应力及温度变化情况,研究指定点的温度随时间的变化情况
- GB28181 webrtc视频监控 摄像机国标对接源码源代码程序 C C++
- 西南科技大学密码学RSA实验
- simulink三相逆变电路的仿真模型 PWM三相逆变电路,基于Matalab2018a
- 西南科技大学密码学AES实验
- 光伏控制器,光伏三相并网仿真 带说明文件,参考文献 模型内容: 1.光伏+MPPT控制+两级式并网逆变器(boost+三相桥式逆变) 2.坐标变+锁相环+dq功率控制+解耦控制+电流内环电压外环控
- 判断闰年平年.html
- 算数优化算法AOA优化LSTM做多特征输入单输出的二分类及多分类模型 程序内注释详细,直接替数据就可以用 程序语言为matlab 程序可出分类效果图,迭代优化图,混淆矩阵图具体效果如下所示
- 锂电池分选机 欧姆龙NJ501-1500,威伦通触摸屏 锂离子电池自动分选机 电压测试,日置电阻表测试,基恩士测厚仪 国际IEC 61131标准编程模式,设备涵盖伺服运动控制,高创直线电机DD
- Labview示波器源代码,所有信号由内部产生,信号类型可以自己设置,带保存和回放功能,是学习和理解示波器及labview重要手段
- Maxwell 电机设计,motorCAD电机设计,永磁同步电机,开关磁阻电机,直流电机,异步电机仿真
- 大数据基础+Hadoop+HDFS+HBase+Hive+MapReduce+Spark
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈