Exoplayer(MediaX)實現音頻變調和變速播放

在K歌或錄音類應用中變調是個常見需求,比如需要播出蘿莉音/大叔音等。變速播放在影視播放類應用中普遍存在,在傳統播放器Mediaplayer中這兩個功能都比較難以實現,特別在低版本SDK中,而Exoplayer作為google官方推出的Mediaplayer替代者就可以輕松實現。在前兩篇文章中向大家介紹了Exoplayer拓展FFmpeg實現音頻軟解碼和切換原伴唱功能,我們繼續在此基礎上實現變調和變速播放。

最新版本Exoplayer擴展FFmpeg音頻軟解碼保姆級教程

最新版本Exoplayer(MediaX)實現K歌原伴唱包括單音軌和雙音軌?

一·變調

首先我們回憶一下初中物理學習的聲音三大特性:音調-音色-響度

1.?音調

  • 定義:音調是指聲音的高低,它是由發聲體振動的頻率決定的。

  • 原理:振動頻率越高,音調越高;振動頻率越低,音調越低。例如,女高音的音調通常比男低音高,因為女高音的聲帶振動頻率更高。

  • 單位:頻率的單位是赫茲(Hz),表示每秒振動的次數。

2.?響度

  • 定義:響度是指聲音的強弱或大小,它是由發聲體振動的振幅決定的。

  • 原理:振幅越大,聲音越響亮;振幅越小,聲音越微弱。同時,響度還與距離發聲體的遠近有關,距離越遠,響度越小。

  • 單位:響度的單位是分貝(dB)。例如,安靜的圖書館聲音約為30分貝,而搖滾音樂會的聲音可能達到100分貝以上。

3.?音色

  • 定義:音色是指不同物體發聲時,聲音的特色和品質。即使音調和響度相同,不同發聲體發出的聲音仍然可以通過音色進行區分。

  • 原理:音色由發聲體的材料、結構和發聲方式決定。例如,小提琴和鋼琴演奏同一首曲子,音調和響度可能相似,但音色不同,因為它們的發聲結構和材料不同。

  • 應用:音色是人們辨別不同樂器和人聲的重要依據。例如,我們可以通過音色區分不同人的說話聲,或者區分小提琴、大提琴和吉他等樂器的聲音。

變調就是要調節音調,加減音量就是要調節響度。Exoplayer本身并不支持調節音調,而是集成了第三方開源音效庫Sonic來實現的,源碼地址為:https://github.com/waywardgeek/sonic,Exoplayer在此基礎上封裝了SonicAudioProcessor供開發調用,源碼分析參考Android 分場景集成不同音頻倍速算法的實現。而?ijkplayer使用的是soundtouch音效庫。下面看具體實現:

1.自定義DefaultRenderersFactory,得到AudioSink

    @SuppressLint("UnsafeOptInUsageError")public class PluginRenderFactory extends DefaultRenderersFactory {/*** @param context A {@link Context}.*/public PluginRenderFactory(Context context) {super(context);}@Nullable@Overrideprotected AudioSink buildAudioSink(Context context, boolean enableFloatOutput, boolean enableAudioTrackPlaybackParams) {audioSink = new DefaultAudioSink.Builder().setAudioProcessors(new AudioProcessor[]{new SonicAudioProcessor()}).setEnableAudioTrackPlaybackParams(true).build();return audioSink;// return super.buildAudioSink(context, enableFloatOutput, enableAudioTrackPlaybackParams);}@Overrideprotected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, AudioSink audioSink, Handler eventHandler, AudioRendererEventListener eventListener, ArrayList<Renderer> out) {//  audioSink.setPlaybackParameters(new PlaybackParameters(1.0f,0.1f));Log.i(TAG, "=audio pitch=" + audioSink.getPlaybackParameters().pitch);ffmpegAudioRenderer = new FfmpegAudioRenderer(eventHandler, eventListener, audioSink);out.add(ffmpegAudioRenderer);super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);}}

?2.初始化Exoplayer并設置上述自定義的Renderer

 renderersFactory = new PluginRenderFactory(context).setEnableAudioTrackPlaybackParams(true)// .setEnableDecoderFallback(true).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);mExoPlayer = new ExoPlayer.Builder(context, renderersFactory).setTrackSelector(trackSelector)// .setHandleAudioBecomingNoisy(true).build();

3. 通過audioSink.setPlaybackParameters(new PlaybackParameters(1.0f, pitch));實現變調不變速,pitch取值【0.1~1.0】越大,音調越高,第一個參數是speed,可設置音頻播放速度

    public void setPitch(int tone) {if (!mExoPlayer.isPlaying() || lastTone == tone)return;try {lastTone = tone;// Log.i(TAG,"=setPitch="+tone);//   ffmpegAudioRenderer.setPitchMode(tone + 10);float pitch = 1.0f;if (tone >= -5 && tone <= 5) {pitch = 1.0f + 0.1f * tone;}Log.i(TAG, "=setPitch=" + tone + "=pitch=" + pitch);audioSink.pause();audioSink.setPlaybackParameters(new PlaybackParameters(1.0f, pitch));audioSink.play();} catch (Exception e) {Log.i(TAG, "=setPitch error=" + e.toString());}}

二 設置音量

方式一通過AudioSink設置:

audioSink.setVolume(defaultVol);

方式二·通過Exoplayer實例直接設置

mExoPlayer.setVolume(defaultVol);

三 變速播放

   public void setSpeed(float speed) {PlaybackParameters parameters = new PlaybackParameters(speed);mExoPlayer.setPlaybackParameters(parameters);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70869.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Meta最新研究:從單張照片到3D數字人的革命性突破

隨著人工智能技術的發展,3D建模和虛擬人物生成逐漸變得更加普及和高效。Meta(前身為Facebook)的最新研究成果展示了如何僅通過一張普通手機拍攝的照片就能生成高質量、全方位的3D數字人。這項技術不僅適用于虛擬試衣、游戲角色建模,還能廣泛應用于AR/VR內容生成等領域。本文…

軟件供應鏈安全工具鏈研究系列——RASP自適應威脅免疫平臺(上篇)

1.1 基本能力 RASP是一種安全防護技術&#xff0c;運行在程序執行期間&#xff0c;使程序能夠自我監控和識別有害的輸入和行為。也就是說一個程序如果注入或者引入了RASP技術&#xff0c;那么RASP就和這個程序融為一體&#xff0c;使應用程序具備了自我防護的能力&#xff0c;…

2025-02-27 學習記錄--C/C++-PTA 7-29 刪除字符串中的子串

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 二、代碼&#xff08;C語言&#xff09;?? #include <stdio.h> // 引入標準輸入輸出庫&#xff0c…

Redis---字符串SDS(簡單動態字符串)底層結構

文章目錄 什么是SDS&#xff08;簡單動態字符串&#xff09;SDS結構SDS的優點O(1) 時間復雜度獲取字符串長度避免緩沖區溢出減少內存重分配次數二進制安全兼容C語言字符串函數 SDS的操作總結 什么是SDS&#xff08;簡單動態字符串&#xff09; redis是由C語言編寫的&#xff0…

Elasticsearch:使用阿里云 AI 服務進行嵌入和重新排名

作者&#xff1a;來自 Elastic Toms Mura 將阿里云 AI 服務功能與 Elastic 結合使用。 更多閱讀&#xff0c;請參閱 “Elasticsearch&#xff1a;使用阿里 infererence API 及 semantic text 進行向量搜索”。 在本文中&#xff0c;我們將介紹如何將阿里云 AI 功能與 Elastics…

Spring Cloud Alibaba與Spring Boot、Spring Cloud版本對應關系

一、前言 在搭建SpringCloud項目環境架構的時候&#xff0c;需要選擇SpringBoot和SpringCloud進行兼容的版本號&#xff0c;因此對于選擇SpringBoot版本與SpringCloud版本的對應關系很重要&#xff0c;如果版本關系不對應&#xff0c;常見的會遇見項目啟動不起來&#xff0c;怪…

【含文檔+PPT+源碼】基于過濾協同算法的旅游推薦管理系統設計與實現

項目介紹 本課程演示的是一款基于過濾協同算法的旅游推薦管理系統設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套…

MTK Android12 預裝apk可卸載

文章目錄 需求解決方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路徑&#xff1a;4、Android.mk 需求 近期&#xff0c;客戶需要預裝一個apk&#xff0c;同時該apk要可卸載。解…

從 0 到 1,用 Python 構建超實用 Web 實時聊天應用

從 0 到 1&#xff0c;用 Python 構建超實用 Web 實時聊天應用 本文深入剖析如何運用 Python 的 Flask 框架與 SocketIO 擴展&#xff0c;搭建一個功能完備的 Web 實時聊天應用。從環境搭建、前后端代碼實現&#xff0c;到最終運行展示&#xff0c;逐步拆解關鍵步驟&#xff0…

視頻字幕識別和翻譯

下載的視頻很多不是漢語的&#xff0c;我們需要用剪映將語音識別出來作為字幕壓制到視頻中去。 剪映6.0以后語音識別需要收費&#xff0c;但是低版本還是沒有問題。 如果想要非漢語字幕轉成中文&#xff0c;剪映低版本不提供這樣功能。但是&#xff0c;用剪映導出識別字幕&am…

每天一個Flutter開發小項目 (4) : 構建收藏地點應用 - 深入Flutter狀態管理

引言 歡迎回到 每天一個Flutter開發小項目 系列博客!在前三篇博客中,我們從零開始構建了計數器應用、待辦事項列表應用,以及簡易天氣應用。您不僅掌握了 Flutter 的基礎組件和布局,還學習了網絡請求、JSON 解析等實用技能,更重要的是,我們一起探討了高效的 Flutter 學習…

Visual Studio打開文件后,中文變亂碼的解決方案

文件加載 使用Unicode&#xff08;UTF-8&#xff09;編碼加載文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs時&#xff0c;有些字節已用Unicode替換字符替換。保存該文件將不會保留原始文件內容。

OpenGL ES -> GLSurfaceView繪制點、線、三角形、正方形、圓(頂點法繪制)

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

threejs 安裝教程

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“threejs 安裝教程”。 在當今的數字化時代&#xff0c;用戶對視覺體驗的要求越來越高。傳統的2D網頁已經無法滿足所有需求&#xff0c;而三維&#xff08;3D&#xff09;圖形技術則為前端開發者提供了新的方向。…

win11編譯pytorch cuda128版本流程

Geforce 50xx系顯卡最低支持cuda128&#xff0c;torch cu128 release版本目前還沒有釋放&#xff0c;所以自己基于2.6.0源碼自己編譯wheel包。 1. 前置條件 1. 使用visual studio installer 安裝visual studio 2022&#xff0c;工作負荷選擇【使用c的桌面開發】,安裝完成后將…

如何安裝Vm和centos

一、VMware 安裝 &#xff08;一&#xff09;前期準備 下載 VMware 軟件&#xff1a;首先&#xff0c;你需要從 VMware 官方網站下載適合你計算機操作系統版本的 VMware Workstation 軟件安裝包。確保選擇的版本與你的主機操作系統兼容&#xff0c;例如&#xff0c;如果你的主…

OpenGL 04--GLSL、數據類型、Uniform、著色器類

一、著色器 在 OpenGL 中&#xff0c;著色器&#xff08;Shader&#xff09;是運行在 GPU 上的程序&#xff0c;用于處理圖形渲染管線中的不同階段。 這些小程序為圖形渲染管線的某個特定部分而運行。從基本意義上來說&#xff0c;著色器只是一種把輸入轉化為輸出的程序。著色器…

服務器離線部署DeepSeek

目標 本次部署的目標是在本地服務器上部署DeepSeek。但是該服務不能連接外網&#xff0c;因此只能使用離線部署的方式。為了一次完成部署。現在云服務器上進行嘗試。 云服務器部署嘗試 云服務器配置 CentOS72080Ti 11GB 安裝準備 1、上傳iso并配置為本地yum源 安裝前先將…

刪除idea recent projects 記錄

1、退出idea&#xff08;一定要全部退出idea&#xff0c;要不然刪除后&#xff0c;idea一退出&#xff0c;又保存上了&#xff09; 2、進入 C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2024.1\options 目錄 根據不同的版本號 IntelliJIdea2024.1 這個地方…

【MySql】EXPLAIN執行計劃全解析:15個字段深度解讀與調優指南

文章目錄 一、執行計劃核心字段總覽二、關鍵字段深度拆解1. type&#xff08;訪問類型&#xff09;——查詢性能的晴雨表典型場景分析&#xff1a; 2. key_len&#xff08;索引使用長度&#xff09;——索引利用率的檢測儀計算示例&#xff1a; 3. Extra&#xff08;附加信息&a…