Android MediaMuxer合成视频文件
生活随笔
收集整理的這篇文章主要介紹了
Android MediaMuxer合成视频文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相關筆記: Android MediaCodec簡單總結_丞恤猿的博客-CSDN博客 Android使用MediaCodec進行視頻編碼 & 視頻的一些基礎概念介紹_丞恤猿的博客-CSDN博客 Android用AudioRecord+MediaCodec采集音頻和音頻編碼 & 音頻一些基本概念_丞恤猿的博客-CSDN博客
#.簡介
MediaMuxer在Android中可以將編碼后的視頻、音頻數據封裝后輸出為多媒體文件,支持的文件輸出格式包括MP4,webm和3gp。不過MediaMuxer中最多只能添加一條視軌和一條音軌。 一般音視頻編碼由MediaCodec負責,而MediaMuxer處理MediaCodec輸出的編碼數據,合成多媒體文件。
#主要API
1.public MediaMuxer(@NonNull String path, @Format int format)
設置輸出文件路徑 和 輸出文件的媒體格式
2.addTrack(mediaFormat)
添加多媒體軌道。 在MediaCodec獲取輸出緩沖區索引bufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED時,可以去獲取MediaCodec輸出的媒體格式:MediaFormat mediaFormat = mEncoder.getOutputFormat(); 并為MediaMuxer添加對應媒體格式的軌道。
3.start()
開啟混合器
4.writeSampleData(int trackIndex, ByteBuffer byteBuf, BufferInfo bufferInfo)
處理媒體數據,三個參數依次為:軌道號、數據緩沖區、緩沖區配置信息。 后兩者可以從MediaCodec的輸出緩沖數據獲取到。
5.stop()
關閉混合器
6.release()
釋放實例和對應資源
#處理音視頻數據代碼示例:
其實就是不停調用writeSampleData(int trackIndex, ByteBuffer byteBuf, BufferInfo bufferInfo)來處理MeidaCodec輸出的編碼數據。
(這里為MediaCodec的輸出數據自定義了一個封裝類,以下audio、video都是該封裝類對象)
if (null != audio) {ByteBuffer buffer = ByteBuffer.wrap(audio.data);MediaCodec.BufferInfo info = audio.info;//若對應幀包含的是編碼器控制信息,則合成器不需要處理if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {buffer = null;}if (null != buffer && info.size > 0) {buffer.position(info.offset);buffer.limit(info.offset + info.size);try {mMuxer.writeSampleData(mAudioTrack, buffer, info);} catch (Exception e) {//.......進行相關處理........}}
}if (null != video) {ByteBuffer buffer = ByteBuffer.wrap(video.data);MediaCodec.BufferInfo info = video.info;//若對應幀包含的是編碼器控制信息,則合成器不需要處理if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {buffer = null;}if (null != buffer && info.size > 0) {buffer.position(info.offset);buffer.limit(info.offset + info.size);try {mMuxer.writeSampleData(mVideoTrack, buffer, info);} catch (Exception e) {//.......進行相關處理........}}
}
總結
以上是生活随笔為你收集整理的Android MediaMuxer合成视频文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能用你的照片合成舞蹈
- 下一篇: c语言实现hdr图像合成,怎样完成一张H