1. avformat_open_input异常,fmt_ctx返回空指针?

由于老版本ffmpeg缺少av_register_all();或filePath访问不了

AVFormatContext *fmt_ctx = NULL;

av_register_all();

avformat_open_input(&fmt_ctx, filePath, NULL, NULL);

  1. SDL输出纹理宽高范围

SDL_UpdateTexture(texture, NULL, video_buf, video_width);

// 清除当前显示

SDL_RenderClear(renderer);

// 将纹理的数据拷贝给渲染器

SDL_RenderCopy(renderer, texture, NULL, &rect);//末尾参数设置为NULL,渲染充满窗口

// 显示

SDL_RenderPresent(renderer);

纹理更新完毕后会将纹理的数据拷贝给渲染器,交由渲染器进行显示。

在SDL_RenderCopy()函数中,第三个第四个参数需要注意下。

第三个参数:选择输入纹理的一块矩形区域作为输入,设置为null时整个纹理输入。

第四个参数:选择渲染目标的一块矩形区域作为输出,设置为null时整个渲染目标输出。

我们可以理解为纹理就是原视频文件的图像,渲染目标是播放器中显示的输出图像。

因此,一般原视频文件的图像是要全部读取的,而输出的图像大小还需要取决于当前播放器窗口的大小,因此第四个参数通常是可调整的,而第三个参数一般是null。

  1. SDL_Surface vs SDL_Texture

SDL_Surface,它是按照像素存放图像的。我们一般把真彩色的像素称为RGB24数据。

SDL_Texture 与SDL_Surface相似,也是一种缓冲区。只不过它存放的不是真正的像素数据,而是存放的图像的描述信息。当渲染纹理时,SDL以这些描述信息为数据,底层通过OpenGL、D3D 或 Metal操作GPU,最终绘制出与SDL_Surface一样的图形,且效率更高(因为它是GPU硬件计算的)。

  1. SDL_Window 与 SDL_Render

SDL_Window代表的是窗口的逻辑概念,它是存放在主内存中的一个对象。所以当我们调用SDL API 创建窗口后,它并不会被显示出来。

SDL_Render 是渲染器,它也是主存中的一个对象。对Render操作时实际上分为两个阶段:

一、渲染阶段。SDL_RenderCopy(),用户可以画各种图形渲染到SDL_Surface或SDL_Texture 中;

二、显示阶段。以SDL_Texture为数据,通过OpenGL操作GPU,最终将 SDL_Surfce 或SDL_Texture中的数据输出到显示器上

  1. UI主线程中显示modual窗口后,主线程不再响应定时更新事件消息,导致播放暂停

(1)将定时更新渲染数据放到异步事件子线程,则调整窗口尺寸和显示modual窗口后,能持续渲染:

SDL_SetEventFilter(playerEventFilter, ps);//异步事件处理在子线程执行

(2)如果在主线程定时更新渲染,可以考虑将渲染放到QPaintEvent,没有验证?

将AVFrame进行sws_scale后转QImage,在PaintEvent中显示画面

  1. ffmpeg视频帧数据AVFrame转QImage

QImage img = new QImage(w, h, format);

uint8_t *data[AV_NUM_DATA_POINTERS] = { 0 };

data[0] = (uint8_t *)img->bits();

int linesize[AV_NUM_DATA_POINTERS] = { 0 };

sws_scale(swsContext, frame->data, frame->linesize, 0, vCtx->height, data, linesize);//缩放图片

或者

sws_scale(swsContext, (const uint8_t *const *)pframe->data, pframe->linesize, 0, ps->pixel_h,

out_frame.data, out_frame.linesize);

QImage image = new QImage(static_cast<uchar*>(out_frame.data[0]), w, h, QImage::Format_RGB888);

image = image.copy();

// 创建 AVFrame转QImage最佳方法 https://blog.csdn.net/iMatt/article/details/111602372

QImage img (pFrame->width, pFrame->height, QImage::Format_RGB888);

uint8_t* dst[] = { img.bits() };

int dstStride[4];

// AV_PIX_FMT_RGB24 对应于 QImage::Format_RGB888

av_image_fill_linesizes(dstStride, AV_PIX_FMT_RGB24, pFrame->width);

// 转换

sws_scale(imgConvertCtx, pFrame->data, (const int*)pFrame->linesize,

0, pCodecCtx->height, dst, dstStride);

  1. SDL_CreateWindowFrom+SDL_WaitEvent不响应键盘按键事件SDL_KEYDOWN,使用SDL_SetEventFilter也不响应键盘?

SDL_Window* win = SDL_CreateWindowFrom((void*)ui.labelRenderWnd->winId());

SDL_Event sdl_event;

SDL_WaitEvent(&sdl_event);

    int main_quit = 0;SDL_Event event;for (;;) {if (main_quit) {break;}// 等待SDL事件,否则阻塞SDL_WaitEvent(&event);switch (event.type) {case SDL_QUIT: //退出{main_quit = 1;}break;case SDL_MOUSEBUTTONDOWN://鼠标点击{OutputDebugStringW(L"SDL_MOUSEBUTTONDOWN\n");break;}case SDL_KEYDOWN://键盘按键,无法直接响应,由Qt事件转发{if (event.key.keysym.sym == SDLK_ESCAPE) {main_quit = 1;}}break;case FF_REFRESH_EVENT: //定时器刷新事件{video_refresh_timer(event.user.data1);}break;default:break;}}

解决方法:由Qt窗口的按键事件转发给SDL_Event

#include "windows.h"
#include <sstream>
#include "SDL2/SDL.h"void VideoPlayDialog::keyPressEvent(QKeyEvent *event)
{std::wostringstream str_cout;str_cout << __FUNCTION__ << " key=" << event->text().toStdWString() << std::endl;std::wstring log = str_cout.str();OutputDebugStringW(log.c_str());SDL_Event sdl_event;sdl_event.type = SDL_KEYDOWN;sdl_event.key.keysym.sym = event->key();SDL_PushEvent(&sdl_event);
}void VideoPlayDialog::keyReleaseEvent(QKeyEvent *event)
{std::wostringstream str_cout;str_cout << __FUNCTION__ << " key=" << event->text().toStdWString() << std::endl;std::wstring log = str_cout.str();OutputDebugStringW(log.c_str());SDL_Event sdl_event;sdl_event.type = SDL_KEYUP;sdl_event.key.keysym.sym = event->key();SDL_PushEvent(&sdl_event);
}

FFmpeg+SDL2开发播放器遇到问题相关推荐

  1. FFmpeg+SDL2音频播放器

    基于雷神最简单的音频播放器修改. /** * 最简单的基于FFmpeg的音频播放器 2 * Simplest FFmpeg Audio Player 2 * * 雷霄骅 Lei Xiaohua * l ...

  2. FFMPEG+SDL2 实现播放器功能

    ffmpeg视频H264压缩,rtsp推流课程教学视频: https://edu.csdn.net/course/detail/27795 课件中里面提供源码可以直接下载运行! ----------- ...

  3. C++基于ffmpeg和QT开发播放器~学习笔记

    C++基于ffmpeg和QT开发播放器 B站网址 https://www.bilibili.com/video/BV1h44y1t7D8?p=2&spm_id_from=pageDriver ...

  4. ffmpeg实战教程(二)用SDL播放YUV,并结合ffmpeg实现简易播放器

    ffmpeg实战教程(二)用SDL播放YUV,并结合ffmpeg实现简易播放器 https://blog.csdn.net/King1425/article/details/71171142 我们先实 ...

  5. ffmpeg提取音频播放器总结

    ffmpeg提取音频播放器总结:  一:简介  从编写音频播放器代码到完成播放器编写,测试,整整5天的时间,这时间还不算之前对 ffmpeg熟悉的时间,可以说是历经千辛万苦,终于搞出来了,虽然最终效果 ...

  6. iOS 开发 - 播放器Demo开发记录

    iOS 开发 - 播放器Demo开发记录 标签: ios 2014-12-22 14:14 518人阅读 评论(0) 收藏 举报  分类: Mac OS X(50)  版权声明:本文为博主原创文章,未 ...

  7. Android media ---- 1.7.ffmpeg 简单音频播放器

    哎,喜欢偷懒,这边直接抄袭下雷神的代码.雷神是个值得敬佩的程序员. vs代码下载链接: https://pan.baidu.com/s/1c2dIuYk 密码:ld4b /* *最简单的基于FFmpe ...

  8. 使用FFMPEG实现音频播放器

    使用FFMPEG实现音频播放器 导言 因为公司项目的原因,要学习如何使用FFMPEG进行音频播放,折腾一圈发现,使用FFMPEG还真不是一件简单的事,更为可惜的是,当年在这方面的杰出人物-雷霄骅的英逝 ...

  9. 使用VLC开源库开发播放器

    使用VLC开发播放器,分为如下几步: 1. 下载VLC开源库 下载VLC开源库,可在官网上下载, 地址如下:http://download.videolan.org/pub/videolan/vlc/ ...

最新文章

  1. 二叉树的建立和遍历的各种问题
  2. Spark Streaming之Kafka的Receiver和Direct方式
  3. H3C查看系统启动配置文件
  4. 【清华大学-腾讯】关系提取综述,Review and Outlook for Relation Extraction
  5. 页面打开自动触发onlick事件
  6. am3352 软时钟老是漂移 rx-8025时钟 rx-8025SA时钟
  7. 解决Cannot find module ‘./index.module.scss‘ or its corresponding type declarations.ts(2307)
  8. [LeetCode] Maxium Subarray
  9. 《Web设计大全》读书笔记之一
  10. PJSIP 下载和编译
  11. 新颖的 USB HUB快充方案助您无忧!!(兼容PD、QC、AFC等快充协议)
  12. logback-spring.xml配置详解
  13. python数据爬取---简单页面的爬取
  14. Android Studio新建工程及测试效果
  15. 周杰伦入局元宇宙,带你搞懂元宇宙怎么玩
  16. java元编程_一文读懂元编程
  17. 华为各类工程师通信基础面试题库以及答案
  18. oracle job enq tx,【学习笔记】Oracle等待事件 enq:TX–allocate ITL entry产生原因和解决办法...
  19. pycharm利用快捷键实现多选相同标签并修改
  20. webman 报错解决手册

热门文章

  1. matlab判断字符串包含字符串,确认字符串包含指定字符串
  2. 从一只狗的创新说开去
  3. Linux安装JDK及Maven
  4. SQLServer 执行动态SQL语句
  5. 弱矩阵组织下项目经理如何最大程度影响项目?
  6. 关于四大作用域对象的总结
  7. 抓包分析rtsp\rtp\h264
  8. 月薪1000到游戏创业赚百万,程序员到自媒体达人,他是怎么做到的?
  9. 高精度秒表StopWatch的使用方法及示例程序
  10. ucinet常用分析路径