1. 程式人生 > >Android之ffmpeg-H264解碼-移植ffmpeg中的H264解碼部分到Android

Android之ffmpeg-H264解碼-移植ffmpeg中的H264解碼部分到Android

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://www.cnblogs.com/mcodec/articles/1780598.html

相關推薦

Androidffmpeg-H264解碼-移植ffmpegH264解碼部分Android

H264解碼器原始碼,移植ffmpeg中的H264解碼部分到Android,深度刪減優化,在模擬器(320x480)中驗證通過。 程式的採用jni架構。介面部分,檔案讀取,視訊顯示都是用java做的,底層的視訊解碼用C來做滿足速度的要求。 在這個版本中,從H264碼

FFMPEG實現RTSPH264資料流解碼 並且實時播放

主要改動原始檔案的讀取 播放器是播放本地檔案 而我們這裡需要讀取的是RTSP中H264資料流 char filepath[1024] = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.

03 ffmpeg 解碼SDK調用 H264轉YUV420

03 ffmpeg 解碼sdk調用 h264轉yuv420制作一個H264文件[root@localhost ~]# cd /home/ [root@localhost home]# wget http://sh.yinyuetai.com/uploads/videos/common/0E3E014EBF34

Android 音視頻深入 九 FFmpeg解碼視頻生成yuv文件(附源碼下載)

ava vco av_free html codec ati type free 索引 項目地址,求star https://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg

FFmpeg解碼MP4檔案為h264和YUV檔案

#include <iostream> #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #in

Android直播開發旅(12):初探FFmpeg開源框架

1. FFmpeg介紹與裁剪 1.1 FFmpeg簡介  FFmpeg(Fast forword mpeg,音視訊轉換器)是一個開源免費跨平臺的視訊和音訊流方案,它提供了錄製/音視訊編解碼、轉換以及流化音視訊的完整解決方案。ffmpeg4.0.2原始碼目錄結構如下: 目錄說明:

Mac環境下Android Studio移植FFmpeg

準備: 1. Android Studio 2. FFmpeg-2.8.4   3. android-ndk-r10e 一、ndk編譯ffmpeg 1.下載ffmpeg和ndk ffmpeg下載地址:http://

Android整合ffmpeg(一):編譯ffmpeg

方案選擇 Android中整合ffmpeg的codec功能無非兩種方式: JNI直接呼叫,主要用於App開發(無許可權修改系統底層),如EXOPlayer,JPlayer等。 整合ffmpeg到OMX,即封裝ffmpeg為OMX的plugin,然後實現compone

Android 移植ffmpeg報錯:"atof" referenced by "libavformat.so"

cannot locate symbol "atof" referenced by "libavformat-57.so"... 原因:android的stdlib.h中atof是內聯的, 外部模組不能直接使用。跟android版本有關。 解決辦法:將所有的atof改成strtod 修改

Android直播開發旅(13):使用FFmpeg+OpenSL ES播放PCM音訊

在Android直播開發之旅(12):初探FFmpeg開源框架一文中,我們詳細介紹了FFmpeg框架的架構、音視訊相關術語以及重要的結構體。為了能夠對這些重要的結構體有個深入的理解,本文將在此基礎上,利用FFmpeg解析rtsp資料流以獲取AAC音訊資料,再對AAC進行解碼為PC

FFMpeg 3.2移植android遇到的各種坑,再一次總結

故事很長,慢慢看! 首先我又一個需求,一張jpg加上gif後,變成一個gif動圖。如果你用命令ffmpeg -i  test.jpg -vf 'movie=test.gif[wm];[in][wm]overlay=0:0[out]' out.gif命令的話,我假設你的ff

FFMEPG 平臺移植,介面簡化和外部模組接入 (四)ffmpeg android移植(ffmpeg 視訊編碼)

FFMPEG 視訊編碼最常見的H264,H265需要X264,X265外部模組支援,可以從我們開源平臺的FFMPEG編譯專案裡面獲取程式碼和配置進行一鍵式編譯:https://github.com/Car-eye-team/Car-eye-FFMPEG,我們下面的程式碼主要是為了簡化程式碼呼叫結構。只需要配置

android移植ffmpeg的編譯

一,ffmpeg編譯(版本ffmpeg-HEAD-b2ad33d.tar) 1,安裝彙編編譯器[sudo apt-get install yasm]. 2,ffmpeg根目錄放編譯指令碼build_android.sh內容如下:(備註:NDK相關路徑按自己實際情況修改,若

android 移植 ffmpeg (二) 原始碼分析 JNI程式設計說明

例子原始碼 測試例子源地址: https://github.com/roman10/android-ffmpeg-tutorial  JNI介面程式設計簡要說明 JNI作為一種程式設計介面,是解決Java語言與C/C++語言之間的通訊問題。 我們知道,Java程式碼編譯

Ubuntu下用NDK編譯移植FFmpeg 2.0(配置最新版x264)到Android平臺

將x264配置到ffmpeg中需要先編譯x264,生成靜態庫或動態庫。因為264的靜態庫本身不大(我編譯完成後是1.1M)且考慮到平臺移植問題,這裡選擇的是編譯生成靜態庫。 準備,新建工作空間 (1)建立總目錄FFmpeg-Android eg: mkdir workspace --> cd wor

Android平臺移植ffmpeg的一些筆記

首先: 是要編譯libjnivideo.so和libjniaudio.so 這兩個so因為不同的版本或者修改過的framework是不一樣的,所以需要在android原始碼中 編譯出自己的so。我的android 2.1原始碼是從官網下載回來的,沒有經過修改。 編譯主要

Android 音視頻深入 十 FFmpeg給視頻加特效(附源碼下載)

frame avi sca desc github cor 濾波器 struct find 項目地址,求starhttps://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpe

最簡單的基於FFmpeg的移動端樣例附件:SDL Android HelloWorld

apt 圖片 va_arg dlopen info net src sdn 文件夾 =========================================

FFmpeg(8)-開啟和配置音視訊解碼器(avcodec_find_decoder()、avcodec_alloc_context3())

一.avcodec_find_decoder 獲取解碼器。在使用之前必須保證所用到的解碼器已經註冊,最簡單的就是呼叫avcodec_register_all() 函式,就像之前註冊解封裝器的時候,也要註冊一下。。 AVCodec *avcodec_find_decoder(enum AVCodecID i

Android底層開發紅外遙控驅動移植

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!