文档章节

ffplay 的事件处理分析

曾经花田错
 曾经花田错
发布于 2017/02/06 16:58
字数 359
阅读 100
收藏 1
点赞 0
评论 0

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
博文 33
码字总数 39023
作品 0
海淀
程序员
ffplay for MFC

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

雷霄骅 ⋅ 2014/08/25 ⋅ 0

FFmpeg 3.2.8 发布,多媒体处理工具合集

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

王练 ⋅ 2017/09/20 ⋅ 14

FFmpeg 4.0.1 版本发布,多媒体处理工具合集

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

王练 ⋅ 前天 ⋅ 0

FFmpeg 基本用法

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

刘草 ⋅ 2016/11/17 ⋅ 0

支持硬件编解码器的ffmpeg-SDK,欢迎下载

针对ffmpeg在android手机平台视频处理慢的情况: 我们直接在ffmpeg的底层增加和,极大的加速了ffmpeg的解码和编码能力. 您可以像指定一个编码器,解码器一样,使用硬件编解码: 完全兼容完整的ffm...

daiLIXING ⋅ 2016/03/10 ⋅ 5

FFMPEG install step on windows

FFMPEG install step on windows 1. 下载MinGW和MSYS 链接: https://sourceforge.net/projects/mingw/files/ Download mingw-get-setup.exe (86.5 kB) 双击进行安装,安装后路径C:MinGW 双击......

andrew810810 ⋅ 2016/09/28 ⋅ 0

能不能从ffmpeg中提出ffplay的代码,包括对应的Makefile,有哪位能指导一下吗?

ffmpeg比较大型,能否提取ffplay.c的相关代码出来,并生成对应的Makefile,从而可以编译出一个ffplay执行文件来,不知哪位曾经做过呢?现在用configure生成的makefile太复杂了,对于ffplay的...

PM ⋅ 2011/02/16 ⋅ 0

FFmpeg 4.0.0 正式发布,多媒体处理工具合集

FFmpeg 4.0.0 已正式发布,代号 “Wu” ,更新亮点包括: MagicYUV 编解码器(实验性) Bitstream 过滤器,用于在 H.264,HEVC 和 MPEG-2 流中编辑元数据 TiVo ty/ty demuxer 原生 aptX 和 ...

王练 ⋅ 04/21 ⋅ 8

fxmoviemanager 5.4 发布,视频文件管理器

fxmoviemanager 5.4 发布,该版本提供独立的基于 ffplay 的播放器(要求 SDL 和 ffmpeg 支持);但仍支持 MPLayer 和 ffplay。FxMovieManager 是一个视频文件的管理器 更新:The internal pl...

小卒过河 ⋅ 2011/11/08 ⋅ 0

FxMovieManager 5.2 发布

FxMovieManager 5.2 发布了,该版本提供独立的基于 ffplay 的播放器(要求 SDL 和 ffmpeg 支持);但仍支持 MPLayer 和 ffplay。 FxMovieManager 是一个视频文件的管理器...

红薯 ⋅ 2011/09/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 50分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部