如何在android中关闭两个音频文件
我有2个音频文件。 第一个是背景音乐,第二个是演讲。 (每个都约4分钟)
现在我想混合它们并接收带有背景音乐的4分钟演讲。
你不需要FFMPEG,你可以使用android中提供的标准编解码器。
public void playFile(String fileToPlay) { // see where we find a suitable autiotrack MediaExtractor extractor = new MediaExtractor(); try { extractor.setDataSource(fileToPlay); } catch (IOException e) { out.release(); return; } extractor.selectTrack(0); String fileType=typeForFile(fileToPlay); if (fileType==null) { out.release(); extractor.release(); return; } MediaCodec codec = MediaCodec.createDecoderByType(fileType); MediaFormat wantedFormat=extractor.getTrackFormat(0); codec.configure(wantedFormat,null,null,0); codec.start(); ByteBuffer[] inputBuffers = codec.getInputBuffers(); ByteBuffer[] outputBuffers = codec.getOutputBuffers(); // Allocate our own buffer int maximumBufferSizeBytes = 0; for(ByteBuffer bb:outputBuffers) { int c=bb.capacity(); if (c>maximumBufferSizeBytes) maximumBufferSizeBytes=c; } setupBufferSizes(maximumBufferSizeBytes/4); final MediaCodec.BufferInfo bufferInfo=new MediaCodec.BufferInfo(); MediaFormat format=null; while(true) { long timeoutUs=1000000; int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs); if (inputBufferIndex >= 0) { ByteBuffer targetBuffer = inputBuffers[inputBufferIndex]; int read = extractor.readSampleData(targetBuffer, 0); int flags=extractor.getSampleFlags(); if (read>0) codec.queueInputBuffer(inputBufferIndex, 0,read, 0, flags); else codec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); extractor.advance(); } int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo,timeoutUs); if (outputBufferIndex >= 0) { final boolean last = bufferInfo.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM; int s=bufferInfo.size/4; ByteBuffer bytes=outputBuffers[outputBufferIndex]; ((ByteBuffer)bytes.position(bufferInfo.offset)).asShortBuffer().get(shorts,0,s*2); process(shorts,0,s*2); codec.releaseOutputBuffer(outputBufferIndex, false); if (last) break; } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { outputBuffers = codec.getOutputBuffers(); } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { format = codec.getOutputFormat(); } } extractor.release(); codec.stop(); codec.release();
上面的代码处理1个文件的读取。 “进程”例程(尚未定义)接收交错的样本数组(左/右/左/右/左/右)。 您现在需要做的就是将这些通道添加到目标缓冲区。 例如
short[] target=new short[LENGTH OF 4 MINUTES]; int idx=0; process(short[] audio, int l) { for(int i=0;i
生成的目标数组包含您的重叠样本。
要合并两个音频文件,您必须使用为Android编译的FFMPEG util。 以下是我发现的有关为android编译FFMPEG的一些链接:
- 如何为Android构建FFmpeg
- 下载适用于Android的FFMPEG库(SourceForge)
以下是有关如何在android中使用FFMPEG库来合并2个音频文件的Google网上论坛post。
另外看看这篇 SOpost。 希望能帮助到你。
- Android FileNotFoundexception – 无法从没有文件格式的图像URL获取getInputStream
- java.lang.noclassdeffounderror:com.google.android.gms.R $ styleable没什么帮助我的
- Proguard破坏了我的清洁。 Gson和仿制药
- 如何在等待结束进程时真正显示ProgressDialog
- 将JavaFX项目导出到android
- 使用Goertzel算法检测频率
- Android-Show自定义对话框
- 使用RXJava进行缓存处理
- Android:将calcOpticalFlowPyrLK与MatOfPoint2f一起使用