FFmpeg+SDL2开发播放器遇到问题
创始人
2024-05-30 16:37:25
0
  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)如果将定时更新渲染放到子线程,则调整窗口尺寸后,画面不更新?

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

  1. SDL_CreateWindowFrom+SDL_WaitEvent不响应键盘按键事件SDL_KEYDOWN

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 
#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);
}

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...