文档章节

ffplay 的事件处理分析

曾经花田错
 曾经花田错
发布于 2017/02/06 16:58
字数 359
阅读 106
收藏 1

ffplay 的事件处理依赖于SDL。在 main 函数中:

...
flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
...
if (SDL_Init (flags)) {
        av_log(NULL, AV_LOG_FATAL, "Could not initialize SDL - %s\n", SDL_GetError());
        av_log(NULL, AV_LOG_FATAL, "(Did you set the DISPLAY variable?)\n");
        exit(1);
    }

以上代码完成SDL的初始化工作,其中包含SDL_EVENT的初始化。

事件处理都是在 event_loop 中进行:

/* handle an event sent by the GUI */
static void event_loop(VideoState *cur_stream)
{
    SDL_Event event;
    double incr, pos, frac;

    for (;;) {
        double x;
        refresh_loop_wait_event(cur_stream, &event);
        switch (event.type) {
        case SDL_KEYDOWN:
            if (exit_on_keydown) {
                do_exit(cur_stream);
                break;
            }
            switch (event.key.keysym.sym) {
            case SDLK_ESCAPE:
            case SDLK_q:
                do_exit(cur_stream);
                break;
            case SDLK_f:
                toggle_full_screen(cur_stream);
                cur_stream->force_refresh = 1;
                break;
            ...
            break;

        case SDL_VIDEOEXPOSE:
            cur_stream->force_refresh = 1;
            break;

        case SDL_MOUSEBUTTONDOWN:
            ...

        case SDL_MOUSEMOTION:
            ...
            break;

        case SDL_VIDEORESIZE:
            ...
            break;

        case SDL_QUIT:
        case FF_QUIT_EVENT:
            do_exit(cur_stream);
            break;
        case FF_ALLOC_EVENT:
            alloc_picture(event.user.data1);
            break;
        default:
            break;
        }
    }
}

event_loop 中有循环不停的获取事件,具体的获取事件及刷新视频的操作在函数 refresh_loop_wait_event 中完成。

static void refresh_loop_wait_event(VideoState *is, SDL_Event *event)
{
    double remaining_time = 0.0;
    SDL_PumpEvents();//更新事件队列
    while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS))
    {
        /* 根据时间差值判断是否隐藏焦点 */
        if (!cursor_hidden && av_gettime_relative() - cursor_last_shown > CURSOR_HIDE_DELAY)
        {
            SDL_ShowCursor(0);
            cursor_hidden = 1;
        }

        if (remaining_time > 0.0)
            av_usleep((int64_t)(remaining_time * 1000000.0));
        remaining_time = REFRESH_RATE;
        if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
            video_refresh(is, &remaining_time);
        SDL_PumpEvents();
    }
}

其中,SDL_PumpEvents 函数主动收集来自输入设备的事件,填入事件循环中,从而更新事件队列。

SDL_PeepEvents 会检查事件队列,如果队列中有事件,回取出事件进行处理;如果没有则会按照REFRESH_RATE的延迟去刷新视频。

具体的SDL事件机制可以参考 https://my.oschina.net/u/735973/blog/832117 。

© 著作权归作者所有

共有 人打赏支持
曾经花田错
粉丝 5
博文 42
码字总数 39130
作品 0
海淀
程序员
ffplay for MFC

本工程将ffmpeg项目中的ffplay播放器(ffplay.c)移植到了VC的环境下。并且使用MFC做了一套图形界面。它可以完成一个播放器播放视频的基本流程:解协议,解封装,视频/音频解码,视音频同步,...

雷霄骅
2014/08/25
1K
0
FFmpeg 3.2.8 发布,多媒体处理工具合集

FFmpeg 3.2.8 已发布。FFmpeg 是用于处理音频、视频、字幕和相关元数据的多媒体内容的库和工具的合集。 库: 提供广泛的编解码器实现 流协议、容器格式和基本 I / O 访问实现 hashers、decom...

王练
2017/09/20
1K
14
FFmpeg 4.0.2 版本发布,多媒体处理工具合集

FFmpeg 4.0.2 已发布,FFmpeg 是用于处理音频、视频、字幕和相关元数据的多媒体内容的库和工具的合集。 下载地址 http://ffmpeg.org/download.html#releases 4.0.2 版本对以下这些库进行了更...

clouddyy
07/19
0
0
FFmpeg 基本用法

FFmpegFFmpeg 基本用法本课要解决的问题1.FFmpeg的转码流程是什么?2.常见的视频格式包含哪些内容吗?3.如何把这些内容从视频文件中抽取出来?4.如何从一种格式转换为另一种格式?5.如何放大...

刘草
2016/11/17
49
0
FFmpeg 4.0.1 版本发布,多媒体处理工具合集

FFmpeg 4.0.1 已发布,FFmpeg 是用于处理音频、视频、字幕和相关元数据的多媒体内容的库和工具的合集。 库: 提供广泛的编解码器实现 流协议、容器格式和基本 I / O 访问实现 hashers、decom...

王练
06/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python介绍

Python介绍 一、简介 Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载等,有益于增强源代码的复用性。Python相对于Lisp这种传统的函数式编程语言,P...

星汉
16分钟前
0
0
VS_设置护眼背景色

工具---->选项---->环境---->字体和颜色:

一个小妞
19分钟前
0
0
Flask跨域请求的处理方法

在Flask开发RESTful后端时,前端请求会遇到跨域的问题。下面是解决方法: 使用 flask-cors库可以很容易的解决 pip install flask-cors 两种方法,一个是全局/批量的,一个是单一独立的: 安全...

ykbj
20分钟前
2
0
Pandas学习记录-Series

系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组。轴标签统称为索引。 pandas.Series Pandas系列可以使用以下构造函数创建 - pandas.Series( dat...

kipeng300
27分钟前
0
0
可以实现内网穿透的几款工具

最近没什么事情,看了一些关于内网穿透的文章,因我本身已是做微信开发相关的工作,对这部分关注的比较多,现分享给大家。 首先说下内网穿透的原理。 NAPT原理 在NAT网关上会有一张映射表,表...

哥本哈根的小哥
28分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部