2016-01-13 179 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缓冲区数据以便流式传输到其他机器。 –