2016-01-13 180 views

回答

0

是有可能MediaCodec Reference

下面的代碼將對流PCM M4A等,你必須修改複用器輸出格式爲MP3

private void convertAudio(String filename) throws IOException { 

String outputpath =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()+"/converted.m4a"; 
// Set up MediaExtractor to read from the source. 

MediaExtractor extractor = new MediaExtractor(); 
extractor.setDataSource(filename); 


int trackCount = extractor.getTrackCount(); 

// Set up MediaMuxer for the destination. 
MediaMuxer muxer; 
muxer = new MediaMuxer(outputpath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); 
// Set up the tracks. 
HashMap<Integer, Integer> indexMap = new HashMap<Integer, Integer>(trackCount); 
for (int i = 0; i < trackCount; i++) { 
    extractor.selectTrack(i); 
    MediaFormat format = extractor.getTrackFormat(i); 
    format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AMR_NB); 

    int dstIndex = muxer.addTrack(format); 
    indexMap.put(i, dstIndex); 
} 
// Copy the samples from MediaExtractor to MediaMuxer. 
boolean sawEOS = false; 
int bufferSize = 32000; 
int frameCount = 0; 
int offset = 100; 
ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize); 
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); 
/* if (degrees >= 0) { 
    muxer.setOrientationHint(degrees); 
}*/ 
// Test setLocation out of bound cases 

muxer.start(); 
while (!sawEOS) { 
    bufferInfo.offset = offset; 
    bufferInfo.size = extractor.readSampleData(dstBuf, offset); 
    if (bufferInfo.size < 0) { 

     sawEOS = true; 
     bufferInfo.size = 0; 
    } else { 
     bufferInfo.presentationTimeUs = extractor.getSampleTime(); 
     bufferInfo.flags = extractor.getSampleFlags(); 
     int trackIndex = extractor.getSampleTrackIndex(); 
     muxer.writeSampleData(indexMap.get(trackIndex), dstBuf, 
       bufferInfo); 
     extractor.advance(); 
     frameCount++; 

    } 
} 
muxer.stop(); 
muxer.release(); 

return; 
} 
+0

謝謝。我沒有使用文件。將從AudioRecord類獲得pcm緩衝區數據,並且必須將其轉換爲MP3緩衝區數據以便流式傳輸到其他機器。 –