ffplay播放器剖析(7)----音视频暂停模块分析

文章目录

  • [1. 暂停触发流程](#1. 暂停触发流程)
  • [2. toggle_pause](#2. toggle_pause)
  • [3. stream_toggle_pause](#3. stream_toggle_pause)

1. 暂停触发流程

1.通过SDL触发事件调用toggle_pause

2.toggle_pause调用stream_toggle_pause

3.stream_toggle_pause修改暂停变量

2. toggle_pause

c 复制代码
static void toggle_pause(VideoState *is)
{
    stream_toggle_pause(is);
    is->step = 0;
}

3. stream_toggle_pause

c 复制代码
static void stream_toggle_pause(VideoState *is)
{
    // 如果当前是暂停 -> 恢复播放
    // 正常播放 -> 暂停
    if (is->paused) {// 当前是暂停,那这个时候进来这个函数就是要恢复播放
        /* 恢复暂停状态时也需要恢复时钟,需要更新vidclk */
        // 加上 暂停->恢复 经过的时间
        is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
        if (is->read_pause_return != AVERROR(ENOSYS)) {
            is->vidclk.paused = 0;
        }
        // 设置时钟的意义,暂停状态下读取的是单纯pts
        // 重新矫正video时钟

        set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
    }
    set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
    // 切换 pause/resume 两种状态
    is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
    printf("is->step = %d; stream_toggle_pause\n", is->step);
}

这个函数可以知道,如果当前状态是暂停的话,那么就会进入if函数

看一下if函数流程,首先我们知道我们

is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;

这个就是在之前的基础上加上暂停到开始的时间

set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);

get_clock当是暂停状态时就是获取时钟的pts

set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);

同理是设置外部时钟的

is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;

就是将paused取反

看一下这4个pause会影响那些函数

  1. video_refresh 如果是暂停并且没有强制刷新的话就不会调用该函数,什么时候强制刷新之前有说过,比如修改ffplay窗口大小
  2. read_thread中的pause只会对网络流有效,而其他情况下pause并不会对read_thread有影响,而是继续读数据写入到队列中
  3. get_master_clock中会调用get_clock,而get_clock中如果是paused状态的话就会直接返回pts
  4. audio_decode_frame函数会受到paused影响,会直接返回-1,然后sdl_audio_callback接受到会进行判断,然后输出静音数据,并未有暂停
相关推荐
美狐美颜sdk12 小时前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
音视频牛哥13 小时前
不止于超低延迟:SmartMediaKit iOS Unity3D RTSP/RTMP 播放器的核心竞争力
音视频·unity3d rtsp播放器·unity3d rtmp播放器·smartmediakit·ios unity rtsp·ios unity rtmp·unity3d ios播放器
辰辰观影15 小时前
网盘视频播放器怎么选?2026全平台推荐
经验分享·音视频
guhy fighting16 小时前
怎么去除视频的logo?现在有方法了,使用Remove Logo Now快速去除视频logo
音视频
呆呆的猫16 小时前
【视频生成】2、VDN-MiniMax-H3
音视频
沐禾安信18 小时前
MOV转MP4怎么转换?苹果视频打不开这样解决
音视频·格式转换·mov转mp4
小豆庄18 小时前
视频隐私脱敏怎么处理:识别追踪与本地方案的选型思路
密码学·音视频·视频
Android系统攻城狮18 小时前
Linux FFmpeg深度解析之av_dump_format调用流程与实战(十一)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶
七牛云行业应用18 小时前
爆火OpenFilm 0.2.6:开源 AI 视频 Agent 的安装、编辑与渲染流程(2026 年 10 月 )
人工智能·开源·音视频
Android系统攻城狮18 小时前
Linux FFmpeg深度解析之avcodec_find_decoder调用流程与实战(十二)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶