基於ffmpeg的Android播放器開原始碼 Posted on

jia635發表於2014-07-30
本開源Android播放器基於ffmpeg開發,音視訊在jni層直接輸出,不使用java層的bmp和audiotrack輸出,支援arm彙編加速,超級精簡。

 

本開原始碼播放器使用的音視訊解碼程式碼來源於ffmpeg-0.6.3(http://www.ffmpeg.org),
jni銜接程式碼和java層程式碼來源於havlenapetr(https://github.com/havlenapetr/FFMpeg)。

移植ffmpeg到android的常規關鍵點網上有很多的帖子可以參考,也可以用資料夾比較工具比較一下,看看新增修改刪除了那些檔案。

本開原始碼的編譯環境
1: Android SDK 2.2版,
2: NDK r4版,注意要匯出NDK巨集,

3: IDE開發環境是 eclips 3.5 版

4: libffplay.so是在Android 2.2版原始碼目錄樹中編譯出來的,使用Ubuntu10.04和VMware7.1.1版,目前原始碼不公開
5: libffmpeg.so編譯步驟,cd /cygwin/c/ffplay, ./config_r4.sh, $NDK/ndk-build
6: PC主機開發環境是windows xp。

 

特別注意,此demo只能在 Android SDK 2.2版上使用,其他版本有修改原始碼,重新編譯才行。

 

此開原始碼解決了幾個特別關鍵點,達到實用水平。幾個關鍵點如下:
1:arm彙編程式碼編譯支援,主要是在幾個.mk檔案中新增LOCAL_ARM_MODE := arm語句,
     在config_r4.sh檔案中新增--arch=armv5te和--enable-asm 等開關。
2:在ffmpeg config_r4.sh配置檔案中關閉了一些不用的選項後,連線時總是報一些莫名其妙的連線錯誤,
    本開原始碼給出終極解決方案(在/jni/jni/Android.mk檔案中新增 LOCAL_LDLIBS += C:/ffplay/bin/ndk/local/armeabi/libavcodec.a等語句)。
3:修改havlenapetr中的視訊顯示錯誤bug,經測試havlenapetr原始程式碼在模擬器設定為320x480時顯示正確,在更大的解析度下顯示錯誤,
    本開原始碼已修改好此bug,現在無論什麼解析度都可以正確顯示。

此開原始碼其他注意事項:

1:jni銜接程式碼相比havlenapetr精簡了幾個數量級,更方便網友們研習。
2:此開原始碼不包括play,pause,stop,seek和視音訊同步等功能實現程式碼,這部分程式碼不開源。

3:Android jni層直接輸出音訊示例,Android jni層直接輸出視訊示例,基於ffmpeg的Android播放器開原始碼,三個工程使用相同的庫,相同的方法和技巧,可相互參考。

在moto defy me525上測試通過。


 歡迎下載研習: http://files.cnblogs.com/mcodec/ffplay1.7z

  apk包下載:   http://files.cnblogs.com/mcodec/ffplay1.apk.7z


H264解碼器原始碼,移植ffmpeg中的H264解碼部分到Android,深度刪減優化,在模擬器(320x480)中驗證通過。

程式的採用jni架構。介面部分,檔案讀取,視訊顯示都是用java做的,底層的視訊解碼用C來做滿足速度的要求。

在這個版本中,從H264碼流中分割出Nal是在java層做的,這樣在java層直接呼叫解碼時就知道是否有顯示視訊,缺點的就是耦合度/封裝性差一點。

如果採用在底層做Nal分割的方法,可以封裝得好看一些,但是每次送的資料有限制,如果送的資料太多,底層可能會一次解碼出好幾幀視訊,但是通知到介面層只能顯示一幀,造成丟幀的現象。如果每次送的資料較少,就會有很多次底層呼叫沒有進行實質解碼,很小氣的做法,比如有一壓縮資料幀需要600位元組,如果一次送100個位元組給解碼器,那麼要送6次才會進行實質解碼,因為每個資料幀有大有小,所以只能取極小值才不會導致丟幀。

不過所有的編碼解碼都是各種因素平衡折中的結果,具體用什麼方法具體分析。



如果程式崩潰退出,優先考慮:

1)是否是baseline
2)byte [] NalBuf = new byte[40980]; 緩衝區是否溢位。

如果有B幀,那肯定不是baseline。
 

為便於支援不同解析度的碼流,修改了程式碼。現在只需要修改H264Android.java檔案中第51,74,75行就可測試新解析度。

有些大解析度的碼流可能會異常,優先修改H264Android.java檔案中第161行把Nal緩衝區改大。

兩版本都是用 android-ndk-1.6_r1-windows.zip 和 cygwin 1.7.5-1, gcc4 4.3.4-3 (用 cygcheck -c檢視) 編譯。

注意 /jni/H264Android.cpp檔案新增了extern "C" 關鍵宣告。

解碼原始碼下載地址:http://files.cnblogs.com/mcodec/H264Android.7z 

C++版本下載地址:http://files.cnblogs.com/mcodec/H264Android_CPP.7z



測試碼流(240x320)下載地址:http://files.cnblogs.com/mcodec/butterfly.h264.rar

測試碼流(352x288)下載地址:http://files.cnblogs.com/mcodec/352x288.264.7z




相關文章