我想要完成的是将音轨覆盖在音轨上以形成新的歌曲轨道.
这是我的一些代码.我正在阅读vocal.mp3使用FileInputStream,然后将其保存到像这样的字节数组...
try {
fis = new FileInputStream(myFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bos = new ByteArrayOutputStream();
byte[] buf = new byte[2048];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
System.out.println("read " + readNum + " bytes,");
}
} catch (IOException ex) {
ex.printStackTrace();
}
bytes = bos.toByteArray();
Run Code Online (Sandbox Code Playgroud)
然后......我做了同样的事情music.mp3并将其读入一个单独的字节数组.我不打算为此显示代码,因为它与上面相同.
在我有两个单独的字节数组后,我可以将它们组合起来......
outputStream = new ByteArrayOutputStream( );
try {
outputStream.write( bytes );
outputStream.write( …Run Code Online (Sandbox Code Playgroud) 我目前有两个单独的媒体提取器和编解码器,用于将每个单独的样本分解为ByteBuffers。然后我将每个样本存储到两个short数组中。然后我调用我的混合函数,它将两个样本合并为一个short[],如果我short[]用AudioTrack它来播放,结果会很好,两种声音都可以根据需要同时播放。
但是,我真正想做的是使用MediaMuxer将我的新short[]文件转换回 mp4 音频文件并将其存储到设备以供以后播放。有人可以帮我弄清楚我做错了什么吗?
这是我拥有的一些代码......正如你所看到的,我注释掉了AudioTrack,这就是我试图将short[]背面变成 的地方,ByteBuffer所以我可以使用媒体复用器来创建音频文件。这给我的结果是一个新的音频文件,它是存储在我设备上的正确名称和总长度……但是当我尝试播放它时……它在几分之一秒内从头跳到尾,实际上并没有播放和音频。
songOutPath = Environment.getExternalStorageDirectory()+"/My Folder/song.raw";
muxer = new MediaMuxer(songOutPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
mTrackIndex = muxer.addTrack(format);
muxer.start();
mMuxerStarted = true;
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
final long timeoutUs = 5000;
boolean sawInputEOS = false;
boolean sawOutputEOS = false;
int noOutputCounter = 0;
MediaCodec.BufferInfo info2 = new MediaCodec.BufferInfo();
final long timeoutUs2 = 5000;
boolean sawInputEOS2 = false;
boolean sawOutputEOS2 …Run Code Online (Sandbox Code Playgroud)