当前位置: 首页 > news >正文

FFmpeg暂停、逐帧和音量

暂停、逐帧和音量

播放、暂停

  • 画面要停止
    • 画面停留在最后一帧
  • 声音要停止
    • ⾳频回调接⼝请求数据帧时直接填0
  • 读取数据是否要停⽌?
    • ⾳视频包缓存队列满时进⼊休眠。
  • 暂停->继续 :时钟的恢复
  • 暂停:toggle_pause()

暂停/继续切换状态

函数调⽤关系如下:

main() -->
event_loop() -->
toggle_pause() -->
stream_toggle_pause()

stream_toggle_pause()实现状态翻转:

static void stream_toggle_pause(VideoState *is)
{if (is->paused) {// 这里表示当前是暂停状态,将切换到继续播放状态。// 在继续播放之前,先将暂停期间流逝的时间加到frame_timer中is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;if (is->read_pause_return != AVERROR(ENOSYS)) {is->vidclk.paused = 0;}set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);}set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
}

暂停状态下的视频播放

在video_refresh()函数中有如下代码:

static void video_refresh(void *opaque, double *remaining_time)
{// 视频播放if (is->video_st) {// 暂停处理:不停播放上一帧if (is->paused)goto display;}
}

在暂停状态下,实际就是不停播放上⼀帧(最后⼀帧)图像。画⾯不更新。

暂停状态下的音频播放

sdl_audio_callback->audio_decode_frame

static int audio_decode_frame(VideoState *is)
{int data_size, resampled_data_size;int64_t dec_channel_layout;av_unused double audio_clock0;int wanted_nb_samples;Frame *af;if (is->paused)return -1; // 暂停返回-1, 但这⾥返回-1并不会导致程序结束。....
}

逐帧、调音量、静音

  • 逐帧播放的本质是,播放⼀帧图像,然后暂停。
  • 涉及到的函数和变量:
    • step_to_next_frame()
    • is->step=1 时单步播放一帧,然后 paused
  • 逐帧播放流程
    • 按s键,如果当前处于暂停则启动播放;
    • 播放⼀帧数据然后进⼊暂停状态

逐帧播放是⽤户每按⼀次s键,播放器播放⼀帧画现。

逐帧播放实现的⽅法是:每次按了s键,就将状态切换为播放,播放⼀帧画⾯后,将状态切换为暂停。

函数调⽤关系如下:

main() -->
event_loop() -->
step_to_next_frame() -->
stream_toggle_pause()

实现代码如下:

static void step_to_next_frame(VideoState *is)
{/* if the stream is paused unpause it, then step */if (is->paused)stream_toggle_pause(is); // 如果停止状态则切换is->step = 1; // 切换到逐帧模式
}static void video_refresh(void* opaque, double* remaining_time) {if (is->video_st) {if (is->step && !is->paused)stream_toggle_pause(is); // 逐帧播放模式下,播放一帧暂停}
}

调音量

音量控制的本质:控制采样点的幅值

  • 静音:将采样点数值设置为 0
  • 音量+:提升幅值
  • 音量-:降低幅值

降低音量

ffplay 控制音量的方式:

  • 最大音量:输出解码后的原始数据
  • 静音:输出数值为 0 的数据
    • toggle_mute()
  • 改变音量:通过 SDL_MixAudioFormat 改变编码后数据的幅值
    • update_volume()

静音

static void toggle_mute(VideoState *is)
{is->muted = !is->muted;
}

参考资料:https://github.com/0voice

http://www.dtcms.com/a/427290.html

相关文章:

  • QT中的QTimer.singleShot()函数
  • TCP/IP 四层模型协作流程详解
  • windows显示驱动开发-调试间接显示驱动程序(一)
  • MySQL MVCC:通过 ReadView与 undolog版本链 分析读提交RC和可重复读RR的原理
  • STM32-USB_OTG_FS 与 USB_OTG_HS 的核心区别
  • 输入框内容粘贴时 nbsp; 字符净化问题
  • 网站建设要做哪些黑龙江牡丹江双鸭山伊春推广
  • 软考 系统架构设计师系列知识点之杂项集萃(163)
  • matlab cell 数据转换及记录
  • 涡度通量数据风浪区分析:涡度通量Footprint时空动态分析等析等
  • 【软考网工笔记】第五章(12)【补充】IP子网划分VLSM CIDR
  • 探秘最长连号序列:线性扫描算法与竞赛实战(洛谷P1420)
  • 网站建设计划方案网站内容管理系统(cms)
  • 做项目搭建网站 构建数据库asp影楼网站数据库用什么软件
  • 网站建立的优点如何确保网站安全
  • Ubuntu 如何安装.NET6 runtime
  • 前端-JS基础-day4
  • shell文件
  • 本地渗透测试靶机环境搭建指南(VMware + VirtualBox)
  • Anthropic新模型Claude Sonnet 4.5刷新基准,微美全息AI模型与算力基建赋能千行百业!
  • 云手机服务器多开需要注意哪些
  • mysql和Oracle用户设置双密码配置方法
  • 深圳中企动力网站翻新后seo怎么做
  • 沈阳网站改版网站免费下载app
  • 惠州建网站服务wordpress产品
  • 奉化建设网站万网买的网站备案吗
  • 速通ACM省铜第十八天 赋源码(Neo‘s Escape)
  • 开源 C# 快速开发(十三)进程--管道通讯
  • 甲流防治的新思路:基于肠道菌群的调节策略
  • 深圳网站建设fantodops做电商网站流程