音视频开发:ffplay使用ffmpeg滤镜实现倍速播放

这篇具有很好参考价值的文章主要介绍了音视频开发:ffplay使用ffmpeg滤镜实现倍速播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

曾经为实现倍速播放使用过ffmpeg,对音频使用atempo滤镜即可实现变速不变调。但是当时效果并不是特别好,和soundtouch相比处理后的音质有明显的区别。最近用新版本的ffmpeg滤镜重新实现了倍速播放,发现效果变好,已经达到可接受的程度,所以在此分享具体实现。

一、ffmpeg滤镜

ffmpeg倍速滤镜一般可以用下面这几个:

(1)视频

setpts=0.5*PTS

(2)音频

atempo = 2.0

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓文章来源地址https://www.toymoban.com/news/detail-437005.html

二、ffplay中使用滤镜

在ffplay中可以直接使用ffmpeg的滤镜,在这里实现倍速播放我们只需要处理音频,然后让时钟同步到音频即可。没有音频的情况比较简单,只需要修改视频的pts即可,这里不做说明。

1、定义字段

在VideoState中添加滤镜刷新字段,用以实现动态控制倍速。

默认值为0,当值为1时则刷新滤镜。

int req_afilter_reconfigure;

2、设置滤镜

直接使用音频滤镜即可,atempo的取值范围是0.5-2.0即倍速值。

afilters = "atempo=2";

定义一个设置倍速方法,方便使用。(作为示例没有加线程安全机制)

void set_speed(double value)
{
	if (value < 0.5 || value>2)
		return;
	VideoState* is = (VideoState*)play;
	is->speed = value;
#if CONFIG_AVFILTER
	if (!is->afilters)
	{
		is->afilters = av_malloc(32);
	}
	sprintf(is->afilters, "atempo=%lf", value);
	is->req_afilter_reconfigure = 1;
#endif
}

3、更新滤镜

修改了倍速后,需要播放器动态响应。在ffplay的audio_thread中已经有了更新滤镜的机制,如果音频参数修改了则会进行滤镜更新,我们只需要使用上面定义的req_afilter_reconfigure来触发其更新滤镜即可。代码如下:(作为示例没有加线程安全机制)

if (reconfigure||is->req_afilter_reconfigure) {
				is->req_afilter_reconfigure = 0;
//ffplay更新滤镜源码
}

4、调整时钟

经过滤镜处理的数据得到的avframe时间戳pts以及pkt_pos也被相应的调整了,在ffplay中播放效果是声音变快了,但时钟不变,画面也按照原来速度播放,这肯定是不符合需求的,所以需要重新调整时间相关参数。其实有一种方法,直接使用滤镜处理前的时间参数即可:由于倍速处理后nb_samples和bufferSize都变了,而时间参数(pts以及pkt_pos)不变就会使得sdl_audio_callback同步时钟发生相应变化。

在audio_thread中:

先记录avframe原来的参数

//使用原来的pts
double pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb);
double pos = frame->pkt_pos;
int serial = is->auddec.pkt_serial;
double duration = av_q2d((AVRational) { frame->nb_samples, frame->sample_rate });
//使用原来的pts --end

滤镜处理后使用原来的参数

//使用原来的pts
af->pts = pts;// (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb);
af->pos = pos;//frame->pkt_pos;
af->serial = serial;// is->auddec.pkt_serial;
af->duration = duration;// av_q2d((AVRational) { frame->nb_samples, frame->sample_rate });
//使用原来的pts --end

5、释放资源

由于上述方法中afilters指向的是av_malloc的空间,所以关闭播放器时需要将其释放。
在stream_close中添加

#if	CONFIG_AVFILTER
	if (is->afilters)
	{
		av_free(is->afilters);
		is->afilters = NULL;
	}	
#endif

 如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

到了这里,关于音视频开发:ffplay使用ffmpeg滤镜实现倍速播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频 ffplay播放控制

    选项 说明 q, ESC 退出播放 f 全屏切换 p, SPC 暂停 m 静音切换 9, 0 9减少音量,0增加音量 a 循环切换音频流 v 循环切换视频流 t 循环切换字幕流 c 循环切换节目 w 循环切换过滤器或显示模式 s 逐帧播放 left/right 向后/向前拖动10秒 down/up 向后/向前拖动1分钟 鼠标右键单击 拖动与显

    2024年02月12日
    浏览(52)
  • 音视频 ffplay命令-主要选项

    选项 说明 -x width 强制显示宽带 -y height 强制显示高度 -video_size size 帧尺寸 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频 -pixel_format format 格式设置像素格式 -fs 以全屏模式启动 -an 禁用音频(不播放声音) -vn 禁用视频(不播放视频) -sn 禁用字幕

    2024年02月12日
    浏览(41)
  • 音视频 ffplay命令播放媒体

    播放本地文件 播放网络流 强制解码器 禁用音频或视频 播放YUV数据 播放RGB数据 播放PCM数据 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(52)
  • 音视频 ffplay简单过滤器

    视频旋转 视频反转 视频旋转和反转 音频变速播放 视频变速播放 音视频同时变速 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(56)
  • FFmpeg 音视频开发工具

    目录 FFmpeg 下载与安装 ffmpeg 使用快速入门 ffplay 使用快速入门 1、FFmpeg 是处理音频、视频、字幕和相关元数据等多媒体内容的库和工具的集合。一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。 官网:https://www.ffmpeg.org/ 源码:https://github.com/FFmpeg/FFmpeg。

    2024年02月15日
    浏览(56)
  • 音视频开发---ffmpeg rtmp推流

    推流是将输入视频数据推送至流媒体服务器, 输入视频数据可以是本地视频文件(avi,mp4,flv......),也可以是内存视频数据,或者摄像头等系统设备,也可以是网络流URL。本篇介绍将本地视频文件通过FFmpeg编程以RTMP直播流的形式推送至RTMP流媒体服务器的方法。 推流的网络拓扑

    2024年02月16日
    浏览(81)
  • 音视频开发-ffmpeg介绍-系列一

    目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念: 三.ffmpeg、ffplay、ffprobe区别      4.1 ffmpeg是用于转码的应用程序  4.2 fffplay是用于播放的应用程序       4.3 ffprobe是用于查看文件格式的应用程序      4.4 ffmpeg是用于转码的应用程

    2024年02月16日
    浏览(46)
  • 玩赚音视频开发高阶技术——FFmpeg

    随着移动互联网的普及,人们对音视频内容的需求也不断增加。无论是社交媒体平台、电商平台还是在线教育,都离不开音视频的应用。这就为音视频开发人员提供了广阔的就业机会。根据这些年来网站上的音视频开发招聘需求来看,音视频开发人员的需求量大,且薪资待遇

    2024年02月13日
    浏览(66)
  • ffplay播放器剖析(6)----音视频同步分析

    视频和音频是不同的线程,并且也不会同时解出同一个pts的音视频帧,因此需要音视频同步; 以音频为基准 视频慢了则丢掉部分视频帧(视觉感受就是掉帧) 视频快了就继续渲染上一帧 以视频为基准 音频慢了则加速播放(或者丢帧,丢帧会断音,体验感特别差) 音频快了就放慢数据点

    2024年02月15日
    浏览(72)
  • Qt音视频开发38-ffmpeg视频暂停录制的设计

    基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件

    2023年04月20日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包