前言

基于上一篇文章《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)、定义字段

可以在VideoState中添加soundtouch 字段

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实现倍速播放相关推荐

  1. ffplay使用soundtouch实现倍速播放

    ffplay自定义系列 第一章 自定义播放器接口 第二章 倍速播放(本章) ______第一节 sonic实现倍速播放 ______第二节 soundtouch实现倍速播放(本节) ______第三节 ...

  2. ffplay使用sonic实现倍速播放

    ffplay自定义系列 第一章 自定义播放器接口 第二章 倍速播放(本章) ______第一节 sonic实现倍速播放(本节) ______第二节 soundtouch实现倍速播放 ______第三节 ...

  3. Android音视频开发(2)常用的系统播放器MediaPlayer

    1.状态图及生命周期 MediaPlayer是一个多媒体播放类,通过它控制音视频流或本地音视频资源的播放过程. 它分为很多状态,如下图所示: 图中的单箭头弧代表同步函数调用,双箭头弧代表异步函数调用. ...

  4. 音视频开发系列(15)使用SDL播放音频

    前言   对于Qt应用来说,为了更大的跨平台通用性,使用SDL播放音频,同时也能做更多的扩充操作. 声波   声音是通过空气传播的一种连续的波,简称声波.声音的强弱体现在声波压力的大小上,音调的音调体 ...

  5. 无需插件加速视频,“跳过广告”,倍速播放视频,chrome等游览器倍速播放视频

    背景: 最近发现一个很有意思的东西,具体背景就是我在看B站的教学视频的时候2倍速太慢了,但是B站只支持2倍速,无法手动调节,于是我想去找个chrome的加速插件,由于本人不太擅长找这种类型的资源,找到 ...

  6. 音视频开发——概述(含TUTK demo iOS)

    开发一款播放器,难不难,要怎么做?想必每个进入到音视频领域的新人都有这样的疑问. 如果仅仅是完成项目,可以说很简单.对于iOS开发人员,网上有不少的开源播放器,如kxmovie.ikjplayer,g ...

  7. 音视频开发之旅(32)-音视频学习资料

    目录 为什么要学习音视频? 如何学习系统性音视频? 音视频相关的资料 学习实践的输出文章分类聚合 收获 最近有朋友问想学习音视频,应该怎么学,有什么资料吗? 这个问题也困扰我很久,几年前就想开始音视频 ...

  8. ffplay使用ffmpeg滤镜实现倍速播放

    第一章 自定义播放器接口 第二章 倍速播放(本章) ______第一节 sonic实现倍速播放 ______第二节 soundtouch实现倍速播放 ______第三节 ffmpeg滤镜实现倍速播放( ...

  9. 怎么让在线视频播放html,HTML5网页视频强制变速倍速播放

    Video Speed Controller 是一款倍速播放视频的浏览器插件! 现在网站上播放的视频,基本上都可以实现倍速播放,但偶尔也有些网站上的视频:没有倍速播放功能. 有时候看一些没有倍速播放功 ...

最新文章

  1. ASTreeView Demo:Add, Edit Delete nodes
  2. Android高版本开机广播,android3.1以上,假如程序没有启动过,怎么获取开机广播呢?...
  3. JavaFX中的塔防(2)
  4. 【渝粤教育】国家开放大学2018年秋季 0233-22T学前儿童语言教育 参考试题
  5. 前端学习(3095):vue+element今日头条管理-回顾
  6. 为什么用openstack_如何为OpenStack贡献力量
  7. Visual SVN的安装
  8. xuperchain 区块最大大小 区块容量 maxblocksize
  9. 学生信息管理系统html代码,学生信息管理系统源代码.doc
  10. matlab 平滑曲线连接_如何使用Affinity Designer for mac编辑矢量曲线和形状
  11. 最全36种python设计模式
  12. windows 7 旗舰版 失效key
  13. 【进制转换】如何使用C++将2进制转换为16进制?
  14. 新编php找工作常见面试笔试汇总
  15. 不要抱怨自己的能力没有「用武之地」
  16. 小学五年级计算机课评课,小学数学五年级下册公开课《分数的意义》听课心得体会评课稿...
  17. 互联网晚报 | 12月1日 星期三 | 支付宝上线“支付宝小荷包”功能;快手好物联盟升级为“快分销”;小米公益平台正式上线...
  18. ubuntu20.4 无线网卡AX211 无法连接wifi
  19. TIM bug 总结以及应对方案
  20. unbuntu 安装things_在 Ubuntu 上搭建 thingsboard 开发环境

热门文章

  1. 学习笔记:秒懂频分多址FDMA、时分多址TDMA、码分多址CDMA、空分多址SDMA
  2. 宏语言为何不受欢迎?
  3. 关于已知两点经纬度求球面最短距离的公式推导
  4. 关于NetSuite中系统时间问题
  5. 漫谈WinCE的手写识别技术
  6. GNSS导航电文获取方式
  7. JAVA基础要点复习(10)—个人笔记
  8. HT82V26学习心得
  9. python socket使用UDP控制继电器进行硬件产品循环开关机测试
  10. HDFS 分布式文件系统的搭建与使用