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

相关内容

热门资讯

公司领导年会致辞 公司领导年会致辞  在日常学习、工作和生活中,大家或多或少都用到过致辞吧,致辞要求风格的雅、俗、庄、...
秋季开学典礼主持词 秋季开学典礼主持词(精选6篇)  主持词已成为各种演出活动和集会中不可或缺的一部分。在一步步向前发展...
当幸福来敲门经典台词 当幸福来敲门经典台词大全  在日新月异的现代社会中,我们都可能会用到台词,台词可以刻画人物的性格,表...
六一儿童节开幕致辞 六一儿童节开幕致辞(通用5篇)  在日常的学习、工作、生活中,大家一定都接触过致辞吧,致辞要求风格的...
春晚主持词 春晚主持词(精选11篇)  主持词要根据活动对象的不同去设置不同的主持词。随着社会一步步向前发展,各...
小学国庆节主题活动主持词 小学国庆节主题活动主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在当下的社会中,活动...
八年级班会主持词 八年级班会主持词  主持词要注意活动对象,针对活动对象写相应的主持词。在如今这个中国,活动集会越来越...
职工追悼词 职工追悼词 各位亲友、各位来宾:  今天我们怀着十分沉痛的心情深切悼念退休职工×××。  ×××因病...
春天活动主持词 春天活动主持词  大家上午好!  踏着春天的脚步,踩着春风的节拍,春天已经来到我们中间,春天是生命的...
幼儿园家长会园长致辞 幼儿园家长会园长致辞幼儿园家长会园长致辞亲爱的家长、老师们:首先感谢大家在百忙中抽空参加今天举行的家...
教师节活动主持词 教师节活动主持词  一、什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动...
百日宴致辞 百日宴致辞范文  在日复一日的学习、工作或生活中,许多人都有过写致辞的经历,对致辞都不陌生吧,在各种...
2021年会总经理简短致辞 2021年会总经理简短致辞范文(通用6篇)  在学习、工作、生活中,许多人都有过写致辞的经历,对致辞...
中学秋季开学典礼主持词 中学秋季开学典礼主持词  中学秋季开学典礼主持词    第一项:升国旗仪式(升旗仪式结束后,请新教师...
婚礼男方家长经典致辞 婚礼男方家长经典致辞  大家好!今天是我儿子××和××小姐结婚的大喜日子,我感到非常高兴和荣幸。高兴...
元宵晚会主持词 关于元宵晚会主持词(通用11篇)  主持词是主持人在台上表演的灵魂之所在。在当今社会生活中,司仪等是...
国学经典诵读比赛主持词 国学经典诵读比赛主持词  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。随着社会...
离职感谢词 离职感谢词  在xx近两个月的生活,让我感触很多,首先感谢领导一直以来对我们的包容,感谢x经理的照顾...
年会总经理致辞 年会总经理致辞(精选7篇)  在学习、工作、生活中,大家都经常接触到致辞吧,致辞具有“礼仪性”或“仪...
八十大寿宴会主持词 八十大寿宴会主持词  借鉴诗词和散文诗是主持词的一种写作手法。在当下这个社会中,主持人的需求越来越高...