Java 如何在android中将两个音频文件组合在一起
我有2个音频文件。第一个是背景音乐,第二个是演讲。每一个大约4分钟长Java 如何在android中将两个音频文件组合在一起,java,android,audio,Java,Android,Audio,我有2个音频文件。第一个是背景音乐,第二个是演讲。每一个大约4分钟长 现在,我想把它们混合在一起,接收一个4分钟的演讲和背景音乐。要合并两个音频文件,您必须使用为Android编译的FFMPEG UTI。 以下是我找到的一些关于为android编译FFMPEG的链接: 是关于如何在android中使用FFMPEG库合并2个音频文件的Google群组线程 也有一个这样的帖子看看了。 希望有帮助。您不需要FFMPEG,可以使用android中提供的标准编解码器 public void play
现在,我想把它们混合在一起,接收一个4分钟的演讲和背景音乐。要合并两个音频文件,您必须使用为Android编译的FFMPEG UTI。 以下是我找到的一些关于为android编译FFMPEG的链接: 是关于如何在android中使用FFMPEG库合并2个音频文件的Google群组线程 也有一个这样的帖子看看了。
希望有帮助。您不需要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<l;i++)
target[idx++]+=audio[i]/2;
}
生成的目标数组包含覆盖的样本。给出样本或完整答案。我已经测试过了,无法使用该库。另外,你们给我的那个库是C语言的,不是java语言的,但我有那个java库,但不能使用that@Sadegh很高兴看到有点感激!我知道当我们连续几天偶然发现一个问题时会很沮丧。我只是搜索了一下,给了你一些建议,让你可以尝试一下。至少展示一下你尝试过什么,遇到了什么问题-你不应该来这里让别人为你工作。张贴您尝试过的代码和您认为错误的代码,以及有用的信息,如stacktraces和OutputsDar Stu!这只是我项目的一小部分。我的项目几乎完成了,我只是被我项目的这一部分困住了。如果你搜索关于这个主题的文章,你可以找到20多个问题和答案,我几乎尝试了所有的问题和答案,但没有一个能帮到我。我的word complete的目的是给出一个清晰正确的答案,而不是说使用FFMPEG库。比如说如何使用这个图书馆我被授予了这个问题的奖金,但是你回答晚了,奖金过期了。现在你别无选择。另外,你的答案是1音频而不是2音频,这对我来说是不明确的。但是我给了你正确的答案,感谢你,而不是你的不尊重。好运气,你从地球上消失不是我的问题。我离截止日期还有一天,所以请联系主持人来奖励我。我给出的答案显示了如何加载android编解码器支持的任何音频。第二部分解释了如何覆盖两个音轨。这个问题似乎离题了,因为它是关于要求一个免费的开发者。