小试ffplay+MFC

最近想尝试一下ffplay,于是就动手做了一个播放器。
用的是ffmpeg-3.3.3编译出来的lib,参考了雷神的100行的最简单播放器。

废话不多说直接动手。
先创建了一个MFC项目,用的是对话框。
这里写图片描述

这中间插入了一个Picture Control用于显示视频

然后把ffplay项目移入MFC。解决冲突花了我将近1个多小时。

关键处:

//指定SDL显示在picture 控件
window = SDL_CreateWindowFrom(g_pMyPlayer->GetView()->GetSafeHwnd());

这里的g_pMyPlayer是我的对话框的指针,GetView()是获得picture 控件的指针,最后的GetSafeHwnd()是获取句柄。这样就把视频输出到了控件上。

SDL_Event SDLevent;
SDLevent.type = SDL_KEYDOWN;
SDLevent.key.keysym.sym = SDLK_SPACE;
SDL_PushEvent(&SDLevent);

这里是在点击暂停按钮时候发送的事件

相应的还做了停止按钮这里参照了雷神的代码,不能直接exit()。并做了如下的修改

static void do_exit(VideoState *is)
{
    if (is) {
        stream_close(is);
    }
    if (renderer)
        SDL_DestroyRenderer(renderer);
    if (window)
        SDL_DestroyWindow(window);
    window = nullptr;//把window指针置空
    av_lockmgr_register(NULL);
    uninit_opts();
#if CONFIG_AVFILTER
    av_freep(&vfilters_list);
#endif
    avformat_network_deinit();
    if (show_status)
        printf("\n");
    SDL_Quit();
    av_log(NULL, AV_LOG_QUIET, "%s", "");
    //exit(0);
}

这里如果不把window指针置空,就会在再次点击播放时候出现只有声音没有影像。
这里我顺着程序查了很久,

static void video_display(VideoState *is)
{
    if (!window)//这里
        video_open(is);

    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    if (is->audio_st && is->show_mode != SHOW_MODE_VIDEO)
        video_audio_display(is);
    else if (is->video_st)
        video_image_display(is);//还有这里
    SDL_RenderPresent(renderer);
}

终于发现在video_display函数中会判断window指针是否存在,然后在video_image_display函数中的realloc_texture函数失败,就返回了,就一直没有分配纹理。所以要把window = nullptr; 这样停止之后再点击播放就能有图像了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值