999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Android平臺的音頻播放處理研究與實現

2020-12-23 05:47:19王強洪蕾
軟件 2020年10期

王強 洪蕾

摘? 要: 隨著Android終端設備的普及,基于Android平臺的音頻應用大批涌現。對于音頻的處理,Android提供了MediaPlayer來滿足開發者對音頻的處理,MediaPlayer在音頻采集、解碼和播放,需要將音頻數據從Java層拷貝到native層,對系統資源的消耗是巨大的。為了減少數據的拷貝,開發更加高效的Android音頻應用,能夠直接在native層處理音頻數據顯得尤為重要。本文介紹將FFmpeg與OpenSL ES的數據結構,在native層使用FFmpeg的解碼過程,及使用OpenSL ES對音頻數據的播放處理研究。

關鍵詞: Android;Ffmpeg;OpenSLES;解碼;音頻播放

中圖分類號: TP311.52? ? 文獻標識碼: A? ? DOI:10.3969/j.issn.1003-6970.2020.10.008

本文著錄格式:王強,洪蕾. 基于Android平臺的音頻播放處理研究與實現[J]. 軟件,2020,41(10):3133

【Abstract】: With the popularity of Android terminal devices, a large number of audio applications based on the Android platform have emerged. For audio processing, Android provides MediaPlayer to meet the needs of developers for audio processing. MediaPlayer needs to copy audio data from the Java layer to the native layer for audio acquisition, decoding and playing, which consumes a lot of system resources. In order to reduce the copy of data, to develop more efficient Android audio applications, it is particularly important to be able to directly process audio data in the native layer. This paper introduces the data structure of FFmpeg and OpenSL ES, the decoding process of FFmpeg in the native layer, and the playback processing of audio data using OpenSL ES.

【Key words】: Android; FFmpeg; OpenSLES; Decoded; Audio playback

0? 引言

Android[1-4]終端設備的普及,讓人們對安卓應用的體驗有著越來越高的需求。音頻的處理包含著許多方面,如音樂播放[5],音頻錄制等。手機性能的局限導致對安卓應用在控制性能消耗有著高的需求,所以開發人員在完成音頻應用開發的時候選擇一個合適的方案是必要的。

Android提供了MediaPlayer對音頻進行播放處理,而MediaPlayer在處理音頻上對系統資源有著巨大的消耗。采用FFmpeg與OpenSLES,可以讓應用層傳遞目標音頻的資源地址,使得FFmpeg直接在native層對資源進行訪問,解碼音頻,然后將數據傳遞給OpenSLES進行處理。降低性能消耗。

1? 關鍵技術研究

1.1? FFmpeg

FFmpeg[6]是一套用來記錄,轉換數字音頻、視頻,并能將其轉化為流的開源程序。提供了轉換、錄制與音視頻流化的完整解決方案,不僅包含了編解碼、流化音頻文件的功能,還可以對音頻文件進行錄制、轉換等工作[7]。

通過對FFmpeg的研究,給出其對音頻數據的解碼流程,如圖1所示。

1.2? OpenSL ES

OpenSL ES[8]是針對嵌入式系統調整的無授權費,跨平臺,硬件加速的音頻API。它為嵌入式移動多媒體設備上的應用程序開發人員提供了一套標準化,高性能,低延遲的音頻處理方案,從而實現了硬件和軟件音頻功能的直接跨平臺部署。

OpenSL ES作為音頻開發的API,它相較于Android提供的Java層API,如MediaPlayer,減少了數據在Java層和native層的拷貝,提高效率,并配合FFmpeg,播放解碼轉碼后的PCM音頻數據。

通過對OpenSL ES的研究,給出其對音頻數據的播放流程,如圖2所示。

2? 程序結構與方案設計

2.1? 程序結構設計

對于程序的結構設計,給出其結構圖,如圖3所示。

為了方便開發者的調用,在對native層的調用上封裝了一層代碼,即程序結構圖中的AudioPlayer類,向外提供操作接口,實現了播放,暫停,停止與循環等功能。

在AudioPlayer類中,使用native關鍵字聲明與native層交互的函數,并一一對應在native-lib類中進行實現。通過Java的JNI機制讓Java層與底層C++進行交互,即對native-lib類函數進行調用,具體表現為,向native-lib類傳遞音頻的資源地址,通過對AudioPlayer類提供的音頻控制函數,調用native-lib類中對應的控制方法,對音頻的播放暫停,占用資源釋放與循環進行控制。

在native-lib類中,通過對Decoder類的調用完成解碼,播放,暫停,資源釋放的功能。

在Decoder類中,首先通過FFmpeg完成對音頻信息的采集,解碼器的初始化與音頻解碼的工作,并將解碼完成的音頻數據緩存入SafeQueue類中,再通過調用Audio類進行對音頻的處理工作。

通過Decoder類的調用,Audio類會進行對OpenSL ES的相關初始化,并等待FFmpeg解碼完成的數據,與音頻編碼轉碼,然后進行播放。

2.2? 方案設計

對于FFmpeg的解碼[9]設計,給出其結構圖,如圖4所示。

通過FFmpeg進行對數據源的解碼。這里涉及兩個重要的結構體。AVFormatContext,用于存儲音頻格式中的信息,AVCodecContext,用于存儲音頻解碼器信息[10]。由于解碼是個耗時操作,需要開啟子線程進行解碼,由于Android系統是基于Linux內核,而Linux又是遵循POSIX線程標準的,所以采用POSIX線程創建子線程。完成解碼需要執行以下幾個操作:①FFmpeg通過av_register_all()注冊編解碼器,avformat_network_ init()進行網絡初始化,以便FFmpeg可以直接訪問網絡地址。②通過avformat_open_input(),打開輸入文件流,讀取數據并判斷文件編碼格式,將格式信息存入AVFormatContext結構體中。③通過avformat_find_ stream_info(),獲得文件的編碼信息,將信息存入AVFormatContext結構體中。④遍歷AVFormatContext結構體中的數據流,根據類型判斷,找到音頻流,保存音頻流的索引,并保存至音頻類對象Audio中。⑤通過avcodec_find_decoder()函數與AVFormatContext中保存的文件編碼格式找到相應的解碼器⑥通過avcodec_parameters_to_context(),將音頻流信息保存至AVCodecContext結構體中⑦通過avcodec_open2()打開解碼器。⑧通過av_read_frame()讀取原始音頻數據幀AVPacket,如果讀取失敗,則回調AudioPlayer類,通知調用者,反之,如果成功,則將數據存入SafeQueue類的幀隊列中。由于解碼的速度往往遠大于音頻播放的速度,所以需要對解碼完成后的數據進行緩存,先解碼好的先播放,利用隊列這個數據結構。實現隊列的存、取、獲取隊列長度與清空隊列操作。因為音頻數據是邊解碼邊播放的,在對數據的存與取時可能會產生沖突,所以對于隊列的存與取需要進行同步操作,這里通過POSIX線程,進行加鎖,實現對隊列的同步。

由于利用OpenSL ES進行播放,在播放之前需要對OpenSL ES進行初始化,在循環解碼原始數據幀的同時,進行OpenSL ES初始化,并啟用回調函數。

對于播放的配置回調給出具體流程圖,如圖5所示。

通過接口對象的創建,設置播放數據類型為PCM數據,16位量化位數,雙聲道,立體聲與采樣率,播放狀態為播放,并設置播放回調,監測數據的傳遞。

由于音頻編碼格式多樣,需要對原始音頻幀AVPacket進行重采樣,生成PCM數據,采樣標準為,每秒采樣音頻個數44100 HZ,采樣位數16 bit,輸出聲道為雙聲道。

給出每個采樣點數據大小的計算公式:

size(數據長度) = 采樣個數 * 聲道數 * 單個采樣點大小

對于重采樣并實現播放的具體流程圖,如圖6所示。

從SafeQueue類的緩沖隊列中通過popAVPacket()函數獲得原始音頻數據AVPacket,通過avcodec_ send_packet()函數進行解封裝,得到音頻幀,并將其保存在AVCodecContext中,通過avcodec_receive_frame()函數獲得音頻幀,利用swr_alloc_set_opts()函數設置轉碼后的PCM音頻數據參數,最后通過swr_convert()函數從音頻幀中獲得轉碼后的一幀PCM數據,這時OpenSL ES監測到回調,將PCM數據通過Enqueue()函數加入播放隊列,完成播放。

3? 對比MediaPlayer

3.1? 音頻數據加載時間對比

MediaPlayer的加載時間,與本文方案(AudioPlayer)加載時間(單位:秒)對比如表1所示。

經過試驗測算,在對同一資源地址進行播放時,AudioPlayer所需要的時間約為0.2 S,MediaPlayer所需的時間約為0.45 s。

3.2? 播放音頻時內存增量對比

MediaPlayer與本文方案(AudioPlayer)的播放音頻時內存的增量對比如圖7所示。

經過試驗測算,在對同一資源地址進行播放時,AudioPlayer所占用的內存均值約為2.5 MB,MediaPlayer所占用的內容存均值約為4.6 MB。

4? 結論

采用FFmpeg與OpenSL ES實現了對音頻數據的播放處理,提供了一個較好的解決方案。相比與MediaPlayer不僅提高了數據的加載效率,還減少了Java層和native層之間的數據拷貝,符合了手機性能的需求,提升了用戶的體驗性。

參考文獻

[1]王翠香, 邵星. 基于安卓的大學生掌上論壇系統設計[J]. 軟件, 2015, 36(10): 33-35.

[2]何艷江, 呂鵬, 顏溯, 等. 基于安卓平臺的復合地基處理軟件開發[J]. 軟件, 2015, 36(12): 42-44.

[3]姚永明, 梅雨凱, 章香, 等. 基于安卓的南郵通達掌上校園 APP 的需求分析[J]. 軟件, 2018, 39(8): 45-47.

[4]姚永明, 梅雨凱, 章香, 等. 基于安卓的南郵通達掌上校園 APP 的實現[J]. 軟件, 2018, 39(8): 48-51.

[5]張小琴, 張庚. 基于 Android 平臺的音樂播放器設計與實現[J]. 軟件, 2018, 39(9): 113-116.

[6]鄧正良. 基于FFmpeg和SDL的視頻流播放存儲研究綜述[J]. 現代計算機, 2019(22): 47-50.

[7]石佩青. 基于Android系統在線音樂播放器的設計與實現[D]. 北京郵電大學, 2017.

[8]張希龍. 基于Android平臺的助聽器系統設計和實現[D]. 東南大學, 2017.

[9]羅瀟. Android多媒體平臺下基于FFMPEG的音視頻處理方案研究[D]. 暨南大學, 2016.

[10]Research and Implementation of Video Codec Based on FFmpeg. ZENG Hao, ZHANG Zhi-yong, SHI Lul-in. 2016 International Conference on Network and Information Systems for Computers. 2016.

主站蜘蛛池模板: 一级毛片在线播放| 亚洲天堂区| 国产剧情伊人| 精品一区二区三区视频免费观看| 伦伦影院精品一区| 国产成人一区在线播放| 国产v欧美v日韩v综合精品| 91福利在线看| 免费中文字幕在在线不卡 | 高清亚洲欧美在线看| 欧美日一级片| 无码丝袜人妻| 国产激爽大片高清在线观看| 人妻无码一区二区视频| 亚洲无码高清免费视频亚洲| a毛片免费在线观看| 国产成人精品日本亚洲| 亚洲精品成人7777在线观看| 九九视频免费在线观看| 最新国语自产精品视频在| 国产午夜小视频| 在线日本国产成人免费的| 成人国产精品一级毛片天堂| 国产交换配偶在线视频| 精品久久香蕉国产线看观看gif | 午夜精品福利影院| 影音先锋亚洲无码| 这里只有精品在线| 久久美女精品| 欧洲熟妇精品视频| 高清无码不卡视频| 欧美成人区| 欧美一区二区三区欧美日韩亚洲| 欧美日韩亚洲综合在线观看| 久久窝窝国产精品午夜看片| 国产在线观看成人91| 国产亚洲精品97AA片在线播放| 在线播放国产99re| 日韩欧美中文字幕在线韩免费| 九色综合伊人久久富二代| 国产91蝌蚪窝| 国产大片喷水在线在线视频| 手机看片1024久久精品你懂的| 黄色网址免费在线| 免费在线观看av| 四虎国产永久在线观看| 国产美女无遮挡免费视频网站 | 精品少妇人妻无码久久| 国产精品第一区在线观看| 在线观看国产黄色| 国产三区二区| 99精品福利视频| 蝌蚪国产精品视频第一页| 国产一级片网址| 成年午夜精品久久精品| 亚洲欧美天堂网| 亚洲日韩精品无码专区97| 国产男女免费完整版视频| 亚洲热线99精品视频| 中文字幕在线看| 91无码网站| 综合社区亚洲熟妇p| 欧美色视频在线| 又大又硬又爽免费视频| 日本精品中文字幕在线不卡| 沈阳少妇高潮在线| 欧美综合区自拍亚洲综合绿色| 亚洲欧美国产视频| 国产裸舞福利在线视频合集| 欧美日本在线| 九九热这里只有国产精品| 欧美日韩国产系列在线观看| 青青草a国产免费观看| 色妞永久免费视频| 91在线一9|永久视频在线| 国产成人综合亚洲欧洲色就色| 亚洲一区二区三区国产精品| 麻豆a级片| 国产精品无码制服丝袜| 香蕉视频在线观看www| 国产精品xxx| 欧美激情二区三区|