音视频效果处理之音视频变速播放实现(三)

ijkplayer-音视频变速播放实现 本文主要分析变速播放框架实现细节,不分析sonic以及soundtouch变速算法。在我的sonic变速变调原理一文中会详细讲解基于基音周期来实现变速变调的原理 1.变速入口分析 从jni层的_setPropertyFloat函数 static void ijkMediaPlayer_setPropertyFloat(JNIEnv *env, jobject thiz, jint id, jflo... 阅读详情

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

1.变速入口分析

从jni层的_setPropertyFloat函数

static void ijkMediaPlayer_setPropertyFloat(JNIEnv *env, jobject thiz, jint id, jfloat value)
{
    IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
    JNI_CHECK_GOTO(mp, env, NULL, "mpjni: setPropertyFloat: null mp", LABEL_RETURN);
    ijkmp_set_property_float(mp, id, value);

  LABEL_RETURN:
    ijkmp_dec_ref_p(&mp);
    return;
}

到ff_ffplay.c中的ffp_set_property_float函数来设置速度

void ffp_set_property_float(FFPlayer *ffp, int id, float value)
{
    switch (id) {
        case FFP_PROP_FLOAT_PLAYBACK_RATE:
            ffp_set_playback_rate(ffp, value);
            break;
        case FFP_PROP_FLOAT_PLAYBACK_VOLUME:
            ffp_set_playback_volume(ffp, value);
            break;
        default:
            return;
    }
}

跟踪ffp_set_playback_rate函数,我们可以看到这里主要把速度变量设置给了ffp->pf_playback_rate以及把ffp->pf_playback_rate_changed置1.

void ffp_set_playback_rate(FFPlayer *ffp, float rate)
{
    if (!ffp)
        return;

    av_log(ffp, AV_LOG_INFO, "Playback rate: %f\n", rate);
    ffp->pf_playback_rate = rate;
    ffp->pf_playback_rate_changed = 1;
}

音频变速实现

跟踪这俩个变量,我们可以看到在audio_decode_frame中,我们新增了音频的变速变调算法来处理音频变速。

#if defined(__ANDROID__)
        if (ffp->soundtouch_enable && ffp->pf_playback_rate != 1.0f && !is->abort_request) {
            av_fast_malloc(&is->audio_new_buf, &is->audio_new_buf_size, out_size * translate_time);
            for (int i = 0; i < (resampled_data_size / 2); i++)
            {
                is->audio_new_buf[i] = (is->audio_buf1[i * 2] | (is->audio_buf1[i * 2 + 1] << 8));
            }
            int ret_len = ijk_soundtouch_translate(is->handle, is->audio_new_buf, (float)(ffp->pf_playback_rate), (float)(1.0f/ffp->pf_playback_rate),
                    resampled_data_size / 2, bytes_per_sample, is->audio_tgt.channels, af->frame->sample_rate);
            if (ret_len > 0) {
                is->audio_buf = (uint8_t*)is->audio_new_buf;
                resampled_data_size = ret_len;
            } else {
                translate_time++;
                goto reload;
            }
        } else if (ffp->sonic_enabled && ffp->pf_playback_rate != 1.0f && !is->abort_request) {
            av_fast_malloc(&is->audio_new_buf, &is->audio_new_buf_size, out_size * translate_time * 2);
            for (int i = 0; i < (resampled_data_size / 2); i++)
            {
                is->audio_new_buf[i] = (is->audio_buf1[i * 2] | (is->audio_buf1[i * 2 + 1] << 8));
            }
            int ret_len = sonicStream_translate(is->sonic_handle,is->audio_new_buf,ffp->pf_playback_rate,
            (float)(1.0f/ffp->pf_playback_rate),is->audio_tgt.channels, af->frame->sample_rate,resampled_data_size / 2,bytes_per_sample);
            if (ret_len > 0) {
                is->audio_buf = (uint8_t*)is->audio_new_buf;
                resampled_data_size = ret_len;
            } else {
                translate_time++;
                goto reload;
            }
        }
#endif

sonic变速是加的,下面在音频回调sdl_audio_callback函数中。

if (ffp->pf_playback_rate_changed) {
        ffp->pf_playback_rate_changed = 0;
#if defined(__ANDROID__)
        if (!ffp->soundtouch_enable && !ffp->sonic_enabled) {
            SDL_AoutSetPlaybackRate(ffp->aout, ffp->pf_playback_rate);
        }
#else
        SDL_AoutSetPlaybackRate(ffp->aout, ffp->pf_playback_rate);
#endif
    }
    if (ffp->pf_playback_volume_changed) {
 
av_gettime() 与 av_gettime_relative() 是什么含义? 总结: int64_t av_gettime(void) //返回大纪元开始后的微妙数 int64_t av_gettime_relative(void) // 返回开机后开始的微妙数 阅读详情

相关推荐

音频倍速(变速不变调)的实现

背景:         项目需要,开发一款自己的安卓端播放器,其中需要有一个视频倍速播放的功能。需要实现效果变速不变调。项目基于FFMpeg和WebRtc,通过FFMpeg从网络读取视频流,经过解封装、解复用分离成音频数据包和视频数据包。并分别对音视频数据包进行解码,解码完成之后的音频PCM(44100Hz,16bit,MONO)数据通过WebRtc提供的接口抛给AudioTrack,视

小伙儿在这儿烤地瓜 2万+

创建一个简单的vue时间过滤方法

使用vue去显示时间时,常常需要对获取到的时间数据进行处理显示,这里可以使用filters过滤器的方法来进行 比如:需要显示获取到的时间与当前时间做对比,显示今天昨天前天,更早之前的时间可以显示为需要的时间格式 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="js/vue.js" type="text/javascript" charset="utf-8"

苦作舟的空城机 501

Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutput的采样率,可以规避这个问题,破音不在出现了,但是音调变了,倍速越大变得越快,人声越发不清晰,变得尖锐,也就是通常说的变速变调了。当然这是正常现象,所有搞音视频播放开发者都会遇到这个现象,因为这就是默认的正常现象,但是我们希望听到的是变速不变调,速度可以快,但是要尽量保持人声能够识别。

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 2084

ffplay音视频同步分析(一)

先给出与同步有关的Clock的结构体,为了简化分析,我把Clock的一些字段删掉了,如有有兴趣可查看源码: typedef struct Clock { double pts; /* clock base */ double pts_drift; /* clock base minus time at which we updated the cloc

eydwyz的专栏 1619

ffmpeg实现变速播放的两种方案

文章目录1,变速变调2,变速不变调(使用sonic)3,注意 1,变速变调 在ffplay.c里找到static int audio_decode_frame(EMAVPlayer *player)方法,修改如下(倍速值为player->pf_playback_rate): //设置转换参数 is->swr_ctx = swr_alloc_set_opts(NULL, is->audio_tgt.channel_layout, is->audio_tgt.f

weixin_41605683的博客 4761

ffmpeg-python视频变速:慢动作与快进效果实现

你还在为视频变速效果的复杂命令而头疼吗?想让精彩瞬间以慢动作呈现,或让冗长片段快速掠过?本文将用通俗易懂的方式,带你掌握ffmpeg-python实现视频变速的核心方法,无需记住繁琐的FFmpeg命令行参数。读完你将学会:使用setpts滤镜创建慢动作、通过atempo实现音频变速处理音视频同步问题,以及实战案例中的完整代码实现。 ## 视频变速原理与基础 视频变速的本质是改变帧速率(FPS...

gitblog_00350的博客 995

音视频系列九 使用soundTouch实现音视频变速

soundTouch和TSM算法

Welcome_Word的博客 2320

LAV Filters播放速度控制:变速播放音频处理

你是否曾在观看视频时遇到过这样的困扰:加快播放速度后,音频变调刺耳;放慢速度时,声音沉闷失真?LAV Filters作为一款开源的DirectShow媒体分离器和解码器,通过其强大的音频处理引擎,解决了变速播放中的音频质量问题。本文将深入解析LAV Filters如何实现流畅的变速播放,并指导普通用户进行参数配置。 ## 变速播放的核心挑战 变速播放(Time Stretch)技术需要在改变播...

gitblog_00333的博客 441

实测ExoPlayer变速播放算法:音质与流畅度深度对比

你是否遇到过视频变速播放时声音变调、画面卡顿的问题?作为Android平台最强大的媒体播放框架之一,ExoPlayer提供了多种变速播放实现方案。本文将通过实测对比不同算法的效果差异,帮助开发者选择最适合业务场景的实现方式。 ## 变速播放核心实现架构 ExoPlayer的变速播放功能主要通过Transformer模块实现,核心包含两大组件: [![变速播放架构](https://raw.g...

gitblog_00598的博客 1091

音视频开发:ffplay使用sonic实现倍速播放

ffplay使用sonic实现倍速播放

m0_60259116的博客 1457

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

倍速播放通常有两种方式:一种是变速变调,另一种是变速不变调 一.变速变调 这种方法的原理就是音频重采样。比如说44100Hz采样率的音频,每秒钟有44100个采样点,如果我们要加速为200%播放,最简单的方法是将解码出来的音频数据,均匀的扔掉一部分即可。解码出来44100个采样点,本来可以播放1s的时长,我扔掉一半,那么我们就只剩下 22050 个采样点,仍然按照 44100 的采样率去播放,那么我们就只能播放0.5s的时长,这样音频的播放速率就变为了200%。 如果原始采样率为44100Hz,播放速度

草上爬的博客 5979

ffmpeg播放器声音效果2-变速不变调及变调

关于声音的变速不变调,或者只是单纯的变调,现在很多视频播放器或者音频播放器或者移动端APP都实现了此功能。诸如腾讯视频,爱奇艺视频,优酷视频。。。。。。而我们主要是以SoundTouch开源源码来实现:SoundTouch是一种非常优秀的音频处理算法,大名鼎鼎的安卓端开发开源源码ijkplayer就是用的SoundTouch的算法实现变速不变调。 但是如果同时对音视频实现变速不变调呢,这个其实说...

xjb2006的专栏 3505

(二十二)深入了解AVFoundation-编辑:视频变速功能

本文介绍了使用iOS的AVFoundation框架实现视频变速处理的核心技术。文章首先分析了视频变速在影视制作、短视频等领域的应用价值,随后详细讲解了通过AVMutableVideoComposition调整视频轨道和通过AVMutableAudioMix处理音频轨道的具体实现方法。重点阐述了视频变速中需要同步处理渲染参数、时间范围设置等关键环节,并对比了音频变速相对简单的处理方式。文中提供了完整的代码示例,包括视频合成对象初始化、变速时间计算、轨道时间范围调整等核心操作,最后还指出了实际开发中可能遇到的多

weixin_39339407的博客 760

EpMedia音视频变速与倒放功能完整指南

EpMedia是一款基于FFmpeg开发的Android视频处理框架,以简单易用、体积小巧著称,帮助开发者快速实现音视频变速与倒放等专业处理功能。无论是制作创意短视频还是优化用户体验,掌握这些功能都能让你的应用更具竞争力。 ## 一、音视频倒放功能详解 ### 1.1 核心实现原理 EpMedia的倒放功能通过FFmpeg的`reverse`和`areverse`滤镜实现,分别处理视频流和音频

gitblog_00411的博客 364

实现视频播放器倍速、清晰度切换、m3u8下载功能

视频上很容易就可以做到倍速播放,一般的视频格式都是每秒固定的帧数,按比例跳帧就可以了。音频上其实也可以用这种方式来直接删除一些周期,因为电脑里的音频也是数字化离散化地储存...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 1万+

iOS_Tips开发实战:解决10个常见的音视频处理难题

iOS_Tips是一个持续更新的iOS开发示例项目,涵盖了AVFoundation高仿微信相机拍摄和编辑、人脸检测、实时滤镜、音视频编解码等音视频相关内容,以及OpenGLES、LeetCode算法练习、iOS Crash防护和APM监控、WKWebView等实用技术。本文将聚焦音视频处理领域,为你解决10个常见的开发难题。 ## 1. 如何实现实时人脸检测功能? 在iOS开发中,利用AVFo

gitblog_00802的博客 891

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

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

m0_60259116的博客 2526
上一篇: 音视频效果处理之开发一个抖音级的短视频(二)
下一篇: opencv图像处理之灰度化和二值化
Python_林一
博客等级 码龄7年 755粉丝 510原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值