ffplay自定义系列

第一章 自定义播放器接口
第二章 倍速播放(本章)
______第一节 sonic实现倍速播放
______第二节 soundtouch实现倍速播放(本节)
______第三节 ffmpeg滤镜实现倍速播放
第三章 dxva2硬解渲染
第四章 提供C#接口
第五章 制作wpf播放器


文章目录

  • ffplay自定义系列
  • 前言
  • 一、soundtouch介绍
  • 二、ffplay中使用soundtouch
    • 1、包装接口
    • 2、初始化
      • (1)、定义字段
      • (2)、初始化
    • 3、倍速处理
      • (1)、定义字段
      • (2)、处理数据
    • 4、释放资源
  • 三、附录

前言

基于上一篇文章《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

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;
}

三、附录

soundtouch官网有提供生源码以及成好的库下载:http://www.surina.net/soundtouch/download.html

ffplay使用soundtouch实现倍速播放相关推荐

  1. 音视频开发:ffplay使用soundtouch实现倍速播放

    前言 基于上一篇文章<ffplay使用sonic实现倍速播放>实现倍速播放后,想有个参照相对比下效果,所以用soundtouch也实现了ffplay的倍速播放.个人感觉效果比sonic要好 ...

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

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

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

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

  4. 基于FFmpeg的视频播放器之十一:倍速播放

    倍速播放通常有两种方式:一种是变速变调,另一种是变速不变调 一.变速变调 这种方法的原理就是音频重采样.比如说44100Hz采样率的音频,每秒钟有44100个采样点,如果我们要加速为200%播放,最简 ...

  5. java 音频倍速播放,libsonic - 倍速播放开源库

    概述 libsonic是一个支持音频倍速播放的开源库.支持大于2倍速的播放.有ANSI C的版本,也有纯Java的版本.能够方便的集成进你的应用中. 项目主页:https://android.goog ...

  6. 音视频倍速播放之sonic

    播放器中有个重要的功能就是倍速播放,比如现在有很多在线教育,或者看电影,据说现在的年轻人几乎都是1.2,1.5倍速的播放了,我个人是1.2和1.5倍速使用较多. 比如有的课程老师的语速比较慢,就调快点 ...

  7. 哔哩哔哩n倍速播放视频

    在b站看一些学习视频的时候,有时候2倍速满足不了我们的需求,可以在控制台键入以下命令实现n倍速播放视频 document.querySelector('video').playbackRate = 3

  8. 腾讯视频如何多倍速播放视频

    1.首先打开手机桌面上的"腾讯视频". 怎么下载腾讯视频里的视频_腾讯视频如何多倍速播放视频 2.再进入了腾讯视频的首页后,在首页的页面上选择一个你想要多倍速播放的视频,点击进入这 ...

  9. 腾讯视频真实下载地址_腾讯视频如何多倍速播放视频

    腾讯视频官网版是一款专注视频播放的客户端软件,您可运行腾讯视频,在线享受奇艺网站内全部免费高清正版视频.腾讯视频视频播放器内容丰富,影视更新快,包含腾讯视频所有的视频内容,在线享受腾讯视频站内全部免费 ...

最新文章

  1. autojs开启悬浮窗权限_微信悬浮窗功能普及?甚至更胜一筹
  2. TCP/IP总结(4)TCP 之最大消息长度
  3. 实现table鼠标移动改变table行背景色
  4. 设计模式:命令模式(Command)
  5. HTTP协议长短连接以及无状态
  6. 亲戚的孩子说要寄养在我家,上学方便,怎么明确的拒绝?
  7. 利用JS实现点击按钮后图片自动切换
  8. IDEA安装Vue插件
  9. 2018首届世界传感器大会11月12日-14日在郑州召开
  10. 第一次竞选博客之星,第一次阳光普照
  11. mac如何彻底删除/卸载程序
  12. Mininet系列实验(一):Mininet使用源码安装
  13. 【C++】深度剖析string类的底层结构及其模拟实现
  14. 浅谈汽车OTA的现状与未来发展趋势
  15. dnf跨6服务器维护,地下城与勇士DNF2018全跨区表一览
  16. tp5分配计费统计小例
  17. 实现一个自动搜狗搜索的小爬虫----user-agent反爬
  18. vue页面跳转没有ajax,vue router路由跳转了,但是页面没有变(已解决)
  19. Spread.NET 14.0 Crack 最新版
  20. 解决 Origin 平台安装慢的办法

热门文章

  1. IC验证——SystemVerilog学习
  2. window中的cmd添加至右键快捷键 设置别名(alias)
  3. PT2050(TWS 蓝牙耳机二合一触摸 IC)
  4. Unity 游戏中的战斗系统的架构与设计
  5. MOS管基本原理(整理)
  6. TEANMA(天玛)-定压功放接线方法讲解
  7. 普陀区桃浦镇领导一行莅临上海和数集团开展新春走访慰问
  8. asynctask java_Android异步处理四:AsyncTask的实现原理
  9. Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗
  10. 青春的记忆,小个子前锋,阿圭罗