gpt4 book ai didi

java - 无间隙连接 Mp3 文件

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:04 25 4
gpt4 key购买 nike

我已成功按顺序组合 2 个 mp3 文件。不幸的是,这些文件之间有一个非常小但明显的间隙,这使得很明显它们是两个单独的文件。

我应该提到的是,我亲自从 Cubase 导出了所有这些音频文件,其长度、比特率等完全相同。

我在网上查了一下,找不到太多关于这方面的信息。

我的问题是:

有没有办法在文件末尾截掉一小部分或交叉淡入淡出文件?

我觉得即使是交叉淡入淡出也可能仍然存在差距。

感谢您的帮助!

这是我的代码:

public  void myMethod1() throws IOException
{
File newFile=new File(Environment.getExternalStorageDirectory()
+File.separator
+"Music"
+File.separator
+"MyApp"+File.separator+"MergedFile.mp3");

File newFile1=new File(Environment.getExternalStorageDirectory()
+File.separator
+"Music"
+File.separator
+"MyApp"+File.separator+"file104.mp3");

File newFile2=new File(Environment.getExternalStorageDirectory()
+File.separator
+"Music"
+File.separator
+"MyApp"+File.separator+"file105.mp3");

Log.d("newFile", newFile.toString());
Log.d("newFile1", newFile1.toString());
Log.d("newFile2", newFile2.toString());

FileInputStream fistream1 = new FileInputStream(newFile1 ); // first source file
FileInputStream fistream2= new FileInputStream(newFile2 );//second source file
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(fistream1);
v.add(fistream2);
SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);

if(!newFile.exists()){
newFile.createNewFile();
FileOutputStream fostream=new FileOutputStream(newFile, true);
int temp;

while( ( temp = sistream.read() ) != -1)
{
//System.out.print( (char) temp ); // to print at DOS prompt
fostream.write((byte)temp); // to write to file
}

fostream.close();
sistream.close();
fistream1.close();
fistream2.close();

MediaScannerConnection.scanFile(this,
new String[] { newFile.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
}

最佳答案

按照 MP3 的设计,无缝播放是不可能的。其原因在于 MP3 文件格式/解码链的工作原理。

MP3 解码由一个管道组成,该管道在将第一帧输入解码管道和实际输出第一个非零样本之间有轻微的延迟。

虽然您可以轻松连接两个具有相同参数的 MP3,但这通常不会产生完美的无缝播放,就像两个 WAV 文件一样。为了确保整个声音实际上被输出,编码器将添加一些(不知道确切的数量,可能随输入长度和频率而变化)填充帧,这些填充帧基本上在流的最后包含静音(永远不会输出,如果正常播放,它们只是将真实数据推送到输出阶段)。

如果想法是创建可以动态组合的 block (例如游戏音乐),您可以使用定义的重叠量并在每个 block 的开始/结束处丢弃一定数量的样本以实现无缝播放。尽管某些音频播放器可能支持使用自定义播放列表标签来提示该过程,但这通常不起作用。

另请参阅维基百科了解更多基础知识 http://en.wikipedia.org/wiki/Gapless_playback#Playback_latency

关于java - 无间隙连接 Mp3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26893837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com