日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

EasyDarwin开源音频解码项目EasyAudioDecoder:EasyPlayer Android音频解码库(第二部分,封装解码器接口)...

發布時間:2025/5/22 Android 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EasyDarwin开源音频解码项目EasyAudioDecoder:EasyPlayer Android音频解码库(第二部分,封装解码器接口)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一節我們講了如何基于ffmpeg-Android工程編譯安卓上的支持音頻的ffmpeg靜態庫:http://blog.csdn.net/xiejiashu/article/details/52524099,這篇文章我們將介紹如何封裝安卓的解碼器。

首先,為了能讓我們的app調用調用,我們需要定義一套Java的native接口,解碼器主要有三個接口:

  • create 創建解碼器,參數分別為:?
    • codec:音頻編碼格式,參考EasyTypes.h里面的EASY_SDK_AUDIO_CODEC_*宏定義;
    • sample_rate:采樣率,通常為8000、44000等等;
    • channels:通道數,1、2分別表示單通道、雙通道;
    • sample_bit:采樣精度,通常為16bit;?
      返回解碼器句柄,即后續接口里面用到的handle
  • decode 解碼,參數為:?
    • handle :解碼器句柄
    • buffer:要解碼的buffer(編碼后的音頻數據)
    • offset:編碼數據在buffer里的起始位置
    • length:編碼數據的長度
    • pcm:解碼后的pcm數據
    • outLen 長度至少為1的int數組,如果解碼成功,那outLen[0]被置為pcm的數據長度
  • close 關閉解碼器,參數為解碼器的句柄。關閉后句柄無效,應該置為0.
package org.easydarwin.audio;/*** Created by John on 2016/3/18.*/ public class AudioCodec {static {System.loadLibrary("AudioCodecer");}public static native int create(int codec, int sample_rate, int channels, int sample_bit);public static native int decode(int handle, byte[] buffer, int offset, int length, byte[] pcm, int[] outLen);public static native void close(int handle); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

接下來我們要實現相應的native接口,頭文件可通過調用javah命令(這里不再詳述)來生成。以AAC解碼來說明,create代碼片段如下:

// 創建獲取解碼器AVCodec *pCodec = avcodec_find_decoder(AV_CODEC_ID_AAC);if (pCodec == NULL){LOGI("find aac decoder error");printf("find aac decoder error\r\n");return 0;}// 創建解碼Context并open解碼器pCodecCtx = avcodec_alloc_context3(pCodec);pCodecCtx->channels = channels;pCodecCtx->sample_rate = sample_rate;pCodecCtx->bit_rate = bit_rate;if(avcodec_open2(pCodecCtx, pCodec, NULL) < 0){printf("open codec error\r\n");return 0;}// 分配內存,存放解碼后的數據pFrame = av_frame_alloc();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

decode:

// 源碼流賦值packet.size = length;packet.data = buffer;int got_frame = 0;// 解碼、數據拷貝while (pkt_pos < nLen){// pkt_pos = 0;int got_frame = 0;src_len = avcodec_decode_audio4(pAACD->pCodecCtx, pAACD->pFrame, &got_frame, &packet);if (src_len < 0){return -3;}data_len += src_lenif (got_frame){memcpy(pAACD->pFrame, pAACD->audio_buf, len);dst_len += len;}pkt_pos += src_len;packet.data = pData + pkt_pos;packet.size = nLen - pkt_pos;}if (NULL != outLen) *outLen = dst_len;// 釋放av_free_packet(&packet);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

close:

av_frame_free(&pFrame);avcodec_close(pComponent->pCodecCtx);avcodec_free_context(&pCodecCtx);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

對于其它格式的音頻算法,只要在avcodec_find_decoder時傳入不同的算法ID即可。

接下來,我們需要使用NDK編譯出ANDROID上可以使用的動態庫,為此我們需要編輯Android.mk文件,其內容如下:

# Copyright (C) 2009 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # LOCAL_PATH:= $(call my-dir) SRC_ROOT_PATH := $(call my-dir) LOCAL_INCLUDE := $(LOCAL_PATH)/aacdec/include # 加載預編譯的靜態庫 include $(CLEAR_VARS) LOCAL_MODULE := libavcodec LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libavcodec.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE := libavdevice LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libavdevice.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE := libavfilter LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libavfilter.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE := libavformat LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libavformat.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE := libavutil LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libavutil.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE := libswresample LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libswresample.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS) LOCAL_MODULE := libswscale LOCAL_SRC_FILES := $(LOCAL_PATH)/aacdec/lib/libswscale.a include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)LOCAL_C_INCLUDES += $(LOCAL_PATH) LOCAL_C_INCLUDES += $(LOCAL_INCLUDE)PROJECT_FILES := $(wildcard $(SRC_ROOT_PATH)/*.cpp) PROJECT_FILES += $(wildcard $(SRC_ROOT_PATH)/*.c) PROJECT_FILES += $(wildcard $(SRC_ROOT_PATH)/aacdec/*.cpp)$(warning $(PROJECT_FILES)) PROJECT_FILES := $(PROJECT_FILES:$(LOCAL_PATH)/%=%) $(warning $(PROJECT_FILES)) LOCAL_SRC_FILES := $(PROJECT_FILES)LOCAL_CFLAGS := -D__unix__ -DANDROID_OS -D__arm__ -D__STDC_CONSTANT_MACROSLOCAL_MODULE := AudioCodecerLOCAL_LDLIBS += -L$(LOCAL_PATH)/aacdec/lib -lavcodec -lswscale -lswresample -lavutil -lavformat -lavfilter -lavdevice -llog -lzCFLAGS += -mfpu=neonLOCAL_STATIC_LIBRARIES := libavcodec libswscale libswresample libavutil libavformat libavfilter libavdeviceinclude $(BUILD_SHARED_LIBRARY)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

我們這里需要把之前編譯出來的靜態庫鏈接起來,生成一個動態庫。其中,靜態庫lib文件和頭文件分別放在/aacdec/lib/ 和 /aacdec/include/ 下。

接下來,cd到jni目錄,執行ndk-build,如果順利的話,我們要的動態庫文件就會生成。

整個項目源碼見Github

轉載于:https://www.cnblogs.com/babosa/p/5904606.html

總結

以上是生活随笔為你收集整理的EasyDarwin开源音频解码项目EasyAudioDecoder:EasyPlayer Android音频解码库(第二部分,封装解码器接口)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产福利精品一区 | 中文字幕日韩欧美 | 在线观看入口 | 亚洲女优在线播放 | 一个人免费在线观看视频 | 午夜精品久久久久久久96蜜桃 | 国产老头户外野战xxxxx | www国产精品 | www.白虎 | 色戒未删节版 | 午夜伦理剧场 | 在线观看免费黄视频 | 中文字幕 欧美激情 | 日本xxxx人| 天天操天天玩 | 国产欧美精品一区二区三区 | 国产又色又爽又黄又免费 | 日本真人做爰免费视频120秒 | 欧美黄色激情视频 | 欧美成人精品激情在线视频 | 欧美亚洲综合在线 | 国产一级片免费视频 | 69久久久 | 日本公妇乱偷中文字幕 | 亚洲av永久无码精品三区在线 | 成人免费毛片免费 | 91欧美在线视频 | 久久精品高清视频 | 小说肉肉视频 | 青春草国产视频 | 美国免费黄色片 | 亚洲丝袜av| 久草欧美视频 | 性欧美成人播放77777 | 日本久久中文字幕 | 免费一级网站 | wwwxxx黄色片 | 午夜神马福利 | 好色艳妇小说 | 加勒比视频在线观看 | 黑人借宿巨大中文字幕 | 无码 人妻 在线 视频 | 久久这里都是精品 | 亚洲精品久久久 | 久久精品不卡 | 91传媒在线免费观看 | 国产人妻久久精品一区二区三区 | 一级肉体全黄裸片中国 | 久本草精品| 国产97色 | 久草国产在线视频 | 日韩精品tv| 欧美激情 一区 | 日韩欧美中出 | 已满十八岁免费观看 | 爱爱小视频网站 | 日韩av在线播 | 一级黄色短视频 | 一级大毛片 | 婷久久| 亚洲精品视频一区二区三区 | 国产三级aaa| 国产精品久久久影院 | 炕上如狼似虎的呻吟声 | 免费国产视频在线观看 | 天堂影视在线观看 | 日本视频免费看 | 欧美国产一级 | 快色网站| 日本一本在线观看 | 国产孕交 | 国产乱国产乱老熟300部视频 | jjzz黄色片| 操欧洲美女 | 日本网站黄色 | 欧美日韩一级二级 | 国产又粗又猛又爽又 | 欧美色图30p | 91麻豆蜜桃一区二区三区 | 亚洲av无一区二区三区怡春院 | 国产不卡视频 | 日本理伦片午夜理伦片 | 特级精品毛片免费观看 | 中文字幕 自拍 | 久久久一 | 最新av中文字幕 | 国产一精品一aⅴ一免费 | 天堂国产一区二区三区 | 国产美女被遭强高潮免费网站 | 日日夜夜免费 | 日本中文字幕视频在线 | 成人免费网站www网站高清 | 久久综合狠狠 | 国产91精品久久久久久久网曝门 | 久久成人精品视频 | 亚洲欧美国产高清va在线播放 | 欧美一区二区三区观看 | 三级理论电影 | 亚洲天堂网一区 |