我有2个音频文件。第一个是背景音乐,第二个是演讲。(每个大约四分钟长)
现在,我想将它们混合并接收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<l;i++)
target[idx++]+=audio[i]/2;
}
生成的目标数组将包含您覆盖的样本。
我想得到两个音频文件作为输入,然后按字节合并它们,并将其保存为单个文件。 在这个代码中,我试图在Java中做到这一点,它工作正常,但我不知道如何在android中做到这一点。 如何在Android系统中做到这一点?
问题内容: 我想合并两个或多个视频文件(它们可能是两个mp4或两个3gp或任何其他格式)。 问题答案: 您可以使用的最通用的工具是ffmpeg(如上面@Jeremy所述),但是在手机上使用它需要做一些工作。它也是LGPL许可的,其某些编码器(特别是x264)是GPL。 如果您要连接的两个文件都使用类似的编码,并且包含在从MP4派生的文件格式中(例如3GP),那么一个更简单的解决方案是使用纯Java
我想把两个音频文件合并成一个新文件。我尝试使用MP4parser库,它会导致一些问题,使用SquenceInputStream组合两个音频文件,它会增加音频文件的大小,但只播放初始歌曲。 参考:https://stackoverflow.com/a/43650758/8775993 与StackOverflow答案核对无任何效果。 请提出解决方案。提前谢谢。
我想合并两个视频。两者都有相同的决心。第二个视频没有任何音频 ffmpeg-itest.mp4-ipicture.mp4-filter_complex"[0: v][0: a][1: v][1: a]conat=n=1: v=2: a=1[v][a]"-map"[vv]"-map"[aa]"mergedVideo.mp4 这是我正在使用的命令,但我得到了以下错误流说明符:filtergraph d
我在我的项目中有两个活动。在我的DrawerActivity中,我添加了导航抽屉,在其他活动即TabActivity中,我有片段列表。我试图在DrawerActivity中显示TabActivity的内容。是否有可能这样做,或者我有遵循另一种方法。我是新手开发者,请帮帮我。 draweractivity.java //我的第二个活动是TabActivity,这里我想在draweractivity中
问题内容: 是否有类似于“不等于”的方法? 我要完成的示例如下: 我试图找到不需要我使用的东西。 问题答案: 只需输入一个“!” 在布尔表达式前面