一個音視頻文件是由音頻和視頻組成的,我們可以通過MediaExtractor圆恤、MediaMuxer把音頻或視頻給單獨抽取出來伏钠,抽取出來的音頻和視頻能單獨播放
一钩杰、MediaExtractor API
MediaExtractor主要用于多媒體文件的音視頻數(shù)據(jù)的分離。
該類主要用于音視頻混合數(shù)據(jù)的分離苛萎,接口比較簡單桨昙,首先要通過setDataSource(String path)函數(shù)設(shè)置數(shù)據(jù)源,數(shù)據(jù)源可以是本地文件地址腌歉,也可以使用HTTP協(xié)議的網(wǎng)絡(luò)碼流地址蛙酪。
然后,可以通過下面的代碼塊翘盖,來獲取碼流的詳細(xì)信息桂塞,如:MimeType,分辨率馍驯、編碼格式阁危、碼率、幀率等等汰瘫。
主要API介紹:
- setDataSource(String path):即可以設(shè)置本地文件又可以設(shè)置網(wǎng)絡(luò)文件
- getTrackCount():得到源文件通道數(shù)
- getTrackFormat(int index):獲取指定(index)的通道格式
- getSampleTime():返回當(dāng)前的時間戳
- readSampleData(ByteBuffer byteBuf, int offset):把指定通道中的數(shù)據(jù)按偏移量讀取到ByteBuffer中欲芹;
- advance():讀取下一幀數(shù)據(jù)
- release(): 讀取結(jié)束后釋放資源
MediaMuxer API
MediaMuxer的作用是生成音頻或視頻文件;還可以把音頻與視頻混合成一個音視頻文件吟吝。
主要API介紹:
- MediaMuxer(String path, int format):path:輸出文件的名稱 format:輸出文件的格式菱父;當(dāng)前只支持MP4格式;
- addTrack(MediaFormat format):添加通道剑逃;我們更多的是使用MediaCodec.getOutpurForma()或Extractor.getTrackFormat(int index)來獲取MediaFormat;也可以自己創(chuàng)建浙宜;
- start():開始合成文件
writeSampleData(int trackIndex, ByteBuffer byteBuf, MediaCodec.BufferInfo bufferInfo):把ByteBuffer中的數(shù)據(jù)寫入到在構(gòu)造器設(shè)置的文件中; - stop():停止合成文件
- release():釋放資源
示例
使用MediaExtractor&MediaMuxer API提取input.mp4文件中的視頻數(shù)據(jù)蛹磺,生成除去音頻數(shù)據(jù)之后的純視頻output.mp4文件粟瞬。
源碼地址:https://github.com/Xiaoben336/AnalysisAndPackageMP4.git