ffmpegh264android
Ⅰ RTMP視頻流格式解析
RTMP視頻流格式深入解析
RTMP視頻流格式與FLV有相似之處,主要由Video Tag和Audio Tag的tag data構成,不同之處在於RTMP在發送時不包含tag header和pre tag length。FLV文件結構包括一個FLV Header,由Header和多個tag組成,tag類型包括Video、Audio和Script。
FLV Header包含了文件的基本信息,而Body部分由預先定義的長度和tag序列構成。視頻tag的數據格式中,第一個位元組用於標識幀類型和解碼器ID;音頻tag則通過第一個位元組確定音頻格式、采樣率和類型。例如,音頻數據的第一個byte會顯示音頻格式的詳細信息,視頻數據則用於描述視頻幀類型和解碼器標識。
RTMP抓包的視頻流更直接,以H264編碼為例,當AVC packet類型為AVC Sequence Header時,緊隨其後的是AVCDecoderConfigurationRecord的內容,接著是NALU(Network Abstraction Layer Unit)的數據,其中包含H264編碼的具體信息,如SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)的結構。
對於實際應用,例如將RTSP回調的H264裸流轉換並通過RTMP協議傳輸,涉及到編碼數據的處理和格式轉換,這通常在編碼器或伺服器端進行。如果你對這方面感興趣,可以參考以下資源:
- 免費學習地址:【免費】FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發
- 技術資料分享:C++音視頻學習資料包,包含FFmpeg、WebRTC、RTMP、HLS、RTSP、FFplay、SRS等技術,點擊671977938加入群組獲取免費資源。
Ⅱ Android 編譯 FFmpeg 6.0 - 支持MediaCodec編解碼
在Android上編譯FFmpeg 6.0版本,已成功集成MediaCodec編解碼支持,包括H264和H265編碼。以下是編譯和集成的詳細步驟:
首先,使用Macos 13.2的GCC、Cmake和NDK 21的交叉編譯環境,構建了x264、mp3lame、fdk-aac和opencore-amr等第三方庫。FFmpeg 6.0版本默認支持MediaCodec硬體加速,無需額外開啟,加速選項包括在內。
配置編譯時,選擇靜態鏈接庫,禁用avdevice和postproc模塊,以減少生成的.a文件數量。為了方便,可以編寫腳本自動化configure和make命令。編譯過程中,遇到x264的pkg-config問題,需要指定其位置。
通過ld工具,將所有靜態庫合並成一個libffmpeg-org.so文件,便於使用。合並配置中需注意使用libgcc_real.a,而不是libgcc.a,以適應NDK 21環境。編譯完成後,將庫文件和頭文件添加到Android項目中,配置CmakeLists.txt並實現FFmpegCmd類以調用MediaCodec功能。
開源庫FFmpegCommand提供了基礎的音視頻處理功能,包括FFmpegUtils命令和自定義MediaCodec操作的示例。在實際測試中,使用MediaCodec編碼的效率更高,建議優先使用。
總的來說,FFmpeg 6.0的MediaCodec集成已經成功,可用於Android項目的音視頻編解碼。通過簡單的配置和集成,即可享受MediaCodec帶來的性能優勢。