音视频开发:ffplay使用soundtouch实现倍速播放
前言
基于上一篇文章《ffplay使用sonic实现倍速播放》实现倍速播放后,想有个参照相对比下效果,所以用soundtouch也实现了ffplay的倍速播放。个人感觉效果比sonic要好。
一、soundtouch介绍
soundtouch是一个开源音频处理库,主要包含变速和变调功能,ijkplayer就是使用soundtouch实现视频变速的。
soundtouch是基于c++实现的,编译方式中提供了静态库和动态库。静态库提供c++形式的接口。动态库有c语言形式的函数包装提供,但其头文件添加了非c++错误宏,即一定要在c++环境中使用。
二、ffplay中使用soundtouch
由上述内容可知,虽然soundtouch有一套c语言接口,但soundtouch一定要在c++环境中使用。想在ffplay中使用只能再用c语言包装soundtouch,或者将ffplay改成c++实现。但是由于ffplay.c是完全基于c语言的语法,改成c++后需要修改的地方比较多,比较麻烦,故本文采用c语言包装soundtouch。
1、包装接口
下面是接口定义,实现根据具体需求,静态库则使用SoundTouch.h的类和对象,动态库则使用SoundTouchDLL.h中的c语言接口。
#ifndef CSOUNDTOUCH_H
#define CSOUNDTOUCH_H
#ifdef __cplusplus
extern "C" {
#endiftypedef void* cSoundTouch;const char* cSoundTouch_getVersionString();int cSoundTouch_getVersionId();cSoundTouch cSoundTouch_create();void cSoundTouch_destroy(cSoundTouch soundTouch);void cSoundTouch_setRate(cSoundTouch soundTouch, double newRate);void cSoundTouch_setTempo(cSoundTouch soundTouch, double newTempo);void cSoundTouch_setRateChange(cSoundTouch soundTouch, double newRate);void cSoundTouch_setTempoChange(cSoundTouch soundTouch, double newTempo);void cSoundTouch_setPitch(cSoundTouch soundTouch, double newPitch);void cSoundTouch_setPitchOctaves(cSoundTouch soundTouch, double newPitch);void cSoundTouch_setPitchSemiTones(cSoundTouch soundTouch, int newPitch);void cSoundTouch_setChannels(cSoundTouch soundTouch, int numChannels);void cSoundTouch_setSampleRate(cSoundTouch soundTouch, int srate);double cSoundTouch_getInputOutputSampleRatio(cSoundTouch soundTouch);void cSoundTouch_flush(cSoundTouch soundTouch);void cSoundTouch_putSamples(cSoundTouch soundTouch, float* samples, int numSamples);void cSoundTouch_putSamples_i16(cSoundTouch soundTouch, short* samples, int numSamples);int cSoundTouch_receiveSamples(cSoundTouch soundTouch, float* output, int maxSamples);int cSoundTouch_receiveSamples_i16(cSoundTouch soundTouch, short* output, int maxSamples);void cSoundTouch_clear(cSoundTouch soundTouch);int cSoundTouch_setSetting(cSoundTouch soundTouch, int settingId, int value);int cSoundTouch_getSetting(cSoundTouch soundTouch, int settingId);int cSoundTouch_numUnprocessedSamples(cSoundTouch soundTouch);int cSoundTouch_numChannels(cSoundTouch soundTouch);int cSoundTouch_numSamples(cSoundTouch soundTouch);
#ifdef __cplusplus
};
#endif
#endif
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
2、初始化
根据上述接口直接调用cSoundTouch_create即可创建一个soundtouch对象。
(1)、定义字段
cSoundTouch soundTouch;
(2)、初始化
在stream_component_open中case AVMEDIA_TYPE_AUDIO:的末尾初始化soundtouch。
is->soundTouch = cSoundTouch_create();
cSoundTouch_setSampleRate(is->soundTouch, sample_rate);
cSoundTouch_setChannels(is->soundTouch, nb_channels);
3、倍速处理
在audio_decode_frame中处理重采样后的音频数据,写回音频数据,并调整相关参数。
(1)、定义字段
倍速处理时需要一个速度参数。并且当处理后的数据过大时需要建立新的缓冲区,需要定义一个自己的缓冲区。
double speed;
char* speed_buf;
int speed_buf_size;
(2)、处理数据
在audio_decode_frame中重采样后,更新时钟之前放置如下代码
double speed = is->speed;if (speed != 1){//设置倍速cSoundTouch_setTempo(is->soundTouch, speed);//写入音频数据cSoundTouch_putSamples_i16(is->soundTouch, is->audio_buf, af->frame->nb_samples); int numSamples =2*af->frame->nb_samples / speed;if (speed < 1)//倍速小于1时使用自己的缓冲区{ int size = numSamples * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);if (is->speed_buf_size < size){is->speed_buf = av_realloc(is->speed_buf, size);is->speed_buf_size = size;}is->audio_buf = is->speed_buf;}//读取处理后的数据int new_nb_samples = cSoundTouch_receiveSamples_i16(is->soundTouch, is->audio_buf, numSamples);//更新参数resampled_data_size = new_nb_samples * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);af->frame->nb_samples = numSamples;}
4、释放资源
在stream_component_close中的case AVMEDIA_TYPE_AUDIO中释放资源
if (is->speed_buf)
{av_free(is->speed_buf);is->speed_buf = NULL;
}
if (is->soundTouch)
{cSoundTouch_destroy(is->soundTouch);is->soundTouch = NULL;
}
如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
音视频开发:ffplay使用soundtouch实现倍速播放相关推荐
- ffplay使用soundtouch实现倍速播放
ffplay自定义系列 第一章 自定义播放器接口 第二章 倍速播放(本章) ______第一节 sonic实现倍速播放 ______第二节 soundtouch实现倍速播放(本节) ______第三节 ...
- ffplay使用sonic实现倍速播放
ffplay自定义系列 第一章 自定义播放器接口 第二章 倍速播放(本章) ______第一节 sonic实现倍速播放(本节) ______第二节 soundtouch实现倍速播放 ______第三节 ...
- Android音视频开发(2)常用的系统播放器MediaPlayer
1.状态图及生命周期 MediaPlayer是一个多媒体播放类,通过它控制音视频流或本地音视频资源的播放过程. 它分为很多状态,如下图所示: 图中的单箭头弧代表同步函数调用,双箭头弧代表异步函数调用. ...
- 音视频开发系列(15)使用SDL播放音频
前言 对于Qt应用来说,为了更大的跨平台通用性,使用SDL播放音频,同时也能做更多的扩充操作. 声波 声音是通过空气传播的一种连续的波,简称声波.声音的强弱体现在声波压力的大小上,音调的音调体 ...
- 无需插件加速视频,“跳过广告”,倍速播放视频,chrome等游览器倍速播放视频
背景: 最近发现一个很有意思的东西,具体背景就是我在看B站的教学视频的时候2倍速太慢了,但是B站只支持2倍速,无法手动调节,于是我想去找个chrome的加速插件,由于本人不太擅长找这种类型的资源,找到 ...
- 音视频开发——概述(含TUTK demo iOS)
开发一款播放器,难不难,要怎么做?想必每个进入到音视频领域的新人都有这样的疑问. 如果仅仅是完成项目,可以说很简单.对于iOS开发人员,网上有不少的开源播放器,如kxmovie.ikjplayer,g ...
- 音视频开发之旅(32)-音视频学习资料
目录 为什么要学习音视频? 如何学习系统性音视频? 音视频相关的资料 学习实践的输出文章分类聚合 收获 最近有朋友问想学习音视频,应该怎么学,有什么资料吗? 这个问题也困扰我很久,几年前就想开始音视频 ...
- ffplay使用ffmpeg滤镜实现倍速播放
第一章 自定义播放器接口 第二章 倍速播放(本章) ______第一节 sonic实现倍速播放 ______第二节 soundtouch实现倍速播放 ______第三节 ffmpeg滤镜实现倍速播放( ...
- 怎么让在线视频播放html,HTML5网页视频强制变速倍速播放
Video Speed Controller 是一款倍速播放视频的浏览器插件! 现在网站上播放的视频,基本上都可以实现倍速播放,但偶尔也有些网站上的视频:没有倍速播放功能. 有时候看一些没有倍速播放功 ...
最新文章
- ASTreeView Demo:Add, Edit Delete nodes
- Android高版本开机广播,android3.1以上,假如程序没有启动过,怎么获取开机广播呢?...
- JavaFX中的塔防(2)
- 【渝粤教育】国家开放大学2018年秋季 0233-22T学前儿童语言教育 参考试题
- 前端学习(3095):vue+element今日头条管理-回顾
- 为什么用openstack_如何为OpenStack贡献力量
- Visual SVN的安装
- xuperchain 区块最大大小 区块容量 maxblocksize
- 学生信息管理系统html代码,学生信息管理系统源代码.doc
- matlab 平滑曲线连接_如何使用Affinity Designer for mac编辑矢量曲线和形状
- 最全36种python设计模式
- windows 7 旗舰版 失效key
- 【进制转换】如何使用C++将2进制转换为16进制?
- 新编php找工作常见面试笔试汇总
- 不要抱怨自己的能力没有「用武之地」
- 小学五年级计算机课评课,小学数学五年级下册公开课《分数的意义》听课心得体会评课稿...
- 互联网晚报 | 12月1日 星期三 | 支付宝上线“支付宝小荷包”功能;快手好物联盟升级为“快分销”;小米公益平台正式上线...
- ubuntu20.4 无线网卡AX211 无法连接wifi
- TIM bug 总结以及应对方案
- unbuntu 安装things_在 Ubuntu 上搭建 thingsboard 开发环境