基於ffmpeg的Android播放器開原始碼 Posted on
本開原始碼播放器使用的音視訊解碼程式碼來源於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
相關文章
- Android 基於ffmpeg開發簡易播放器 - ffmpeg解封裝Android播放器封裝
- Android 基於ffmpeg開發簡易播放器 - NDK交叉編譯ffmpegAndroid播放器編譯
- Android 基於ffmpeg開發簡易播放器 – 基礎知識Android播放器
- Android 基於ffmpeg開發簡易播放器 - 基礎知識Android播放器
- 基於ffmpeg+SDL的加密視訊播放器的開發(三)加密播放器
- Android 基於ffmpeg開發簡易播放器 - EGL和OpenGLESGLES顯示YUV視訊Android播放器
- 基於FFmpeg和Qt實現簡易影片播放器QT播放器
- 基於Android 4.4 開發的多視窗系統 開放原始碼Android原始碼
- 從零開始仿寫一個抖音App——基於FFmpeg的極簡視訊播放器APP播放器
- ffmpeg播放器開發 詳細記錄+程式碼實現3播放器
- FFmpeg開發筆記(六)如何訪問Github下載FFmpeg原始碼筆記Github原始碼
- 基於Android的MediaPlayer的音樂播放器的封裝Android播放器封裝
- 容器類原始碼解析系列(一) ArrayList 原始碼分析——基於最新Android9.0原始碼原始碼Android
- android 基於ijkplayer專案進行的播放器Android播放器
- FFmpeg學習之一(FFmpeg原始碼編譯)原始碼編譯
- FFmpeg打造Android萬能音訊播放器總結Android音訊播放器
- 基於Android5.0的Camera Framework原始碼分析 (三)AndroidFramework原始碼
- 基於Android5.0的Camera Framework原始碼分析 (一)AndroidFramework原始碼
- 基於Android5.0的Camera Framework原始碼分析 (二)AndroidFramework原始碼
- 關於FFMPEG的解碼模型模型
- 基於原始碼分析 Android View 繪製機制原始碼AndroidView
- 一步一步搭建基於ffmpeg和sdl2的流媒體播放器播放器
- 基於Android的音樂播放器的設計與實現Android播放器
- 基於 electron-vue 開發的音樂播放器Vue播放器
- 29.FFmpeg+OpenGLES+OpenSLES播放器實現(三.FFmpeg配置和編譯指令碼)播放器編譯指令碼
- 基於原始碼分析 Android View 事件分發機制原始碼AndroidView事件
- ffmpeg在iOS的使用-iFrameExtractor原始碼解析iOS原始碼
- 編譯FFMPEG原始碼的指令碼編寫案例編譯原始碼指令碼
- Android多媒體之視訊播放器(基於MediaPlayer)Android播放器
- 瞭解PCI Express的Posted傳輸與Non-Posted傳輸Express
- 基於AVPlayer完美播放器播放器
- FFmpeg開發筆記(五):ffmpeg解碼的基本流程詳解(ffmpeg3新解碼api)筆記API
- PriorityQueue原理分析——基於原始碼原始碼
- 基於Android5.0的Camera Framework原始碼分析 (四) --- 框架總結AndroidFramework原始碼框架
- Web 端 H265 播放器 (上):WebAssembly 編碼 FFmpegWeb播放器
- FFmpeg開發筆記(八)Linux交叉編譯Android的FFmpeg庫筆記Linux編譯Android
- 基於thinkphp開發的wemall微信商城原始碼系統修復PHP原始碼
- 基於ThinkPHP開發的多商戶微信商城小程式原始碼PHP原始碼