Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
难以将原始PCM输出代码从Java移植到Android AudioTrack API_Java_Android_Audio_Pcm - Fatal编程技术网

难以将原始PCM输出代码从Java移植到Android AudioTrack API

难以将原始PCM输出代码从Java移植到Android AudioTrack API,java,android,audio,pcm,Java,Android,Audio,Pcm,我正在尝试将一个应用程序从JavaSE移植到Android,该应用程序可以播放Chiptune(NSF、SPC等)音乐文件。Android API似乎缺少该应用程序用于输出原始PCM音频的javax多媒体类。我在API中找到的最接近的模拟是AudioTrack,所以我一直在努力解决这个问题 然而,当我试图通过正在进行的端口运行我的一个示例音乐文件时,我得到的只是静态的。我怀疑是我设置的音轨出了问题。我尝试过各种不同的构造函数,但最后都只是输出静态的 原始代码中的数据线设置类似于: AudioFo

我正在尝试将一个应用程序从JavaSE移植到Android,该应用程序可以播放Chiptune(NSF、SPC等)音乐文件。Android API似乎缺少该应用程序用于输出原始PCM音频的javax多媒体类。我在API中找到的最接近的模拟是AudioTrack,所以我一直在努力解决这个问题

然而,当我试图通过正在进行的端口运行我的一个示例音乐文件时,我得到的只是静态的。我怀疑是我设置的音轨出了问题。我尝试过各种不同的构造函数,但最后都只是输出静态的

原始代码中的数据线设置类似于:

AudioFormat audioFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED,
                44100, 16, 2, 4, 44100, true );
DataLine.Info lineInfo = new DataLine.Info( SourceDataLine.class, audioFormat );
DataLine line = (SourceDataLine)AudioSystem.getLine( lineInfo );
我现在使用的构造函数是:

AudioTrack = new AudioTrack( AudioManager.STREAM_MUSIC,
        44100,
        AudioFormat.CHANNEL_CONFIGURATION_STEREO,
        AudioFormat.ENCODING_PCM_16BIT,
        AudioTrack.getMinBufferSize( 44100,
                AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                AudioFormat.ENCODING_PCM_16BIT ),
        AudioTrack.MODE_STREAM );

我已经替换了其中的常量和变量,使它们尽可能简洁明了,但我的基本问题是,在从一种格式转换到另一种格式时,我所做的假设中是否存在任何明显的问题。

因此,今天我有一点时间进一步研究这个问题,我想我已经解决了。上面第一个代码示例中的AudioFormat声明将big-endian参数设置为“true”,但Android AudioTrack希望PCM数据采用little-endian格式

所以我写了一个快速的小循环来测试我的直觉,就像这样:

 for( int i = 0; i + LEN_PCM_SAMPLE_BYTES < LEN_PCM_BUFFER; i += LEN_PCM_SAMPLE_BYTES ) {
    // Really rude endian conversion.
    byte bytTemp = a_bytBuffer[i];
    a_bytBuffer[i] = a_bytBuffer[i + 1];
    a_bytBuffer[i + 1] = bytTemp;
 }
for(int i=0;i+LEN\u PCM\u SAMPLE\u字节
基本上,这个循环翻转缓冲区中每个(16位)样本的字节。这很有效,只是有点起伏,因为效率非常低。我尝试使用ByteBuffer,但似乎无法翻转单个示例中的字节


我会想出更好的办法,但基本问题已经解决了。希望其他人觉得这个有用

即使你是静止的,你是否检查过音轨长度是否正确?有问题的音乐文件实际上没有确定的音轨长度。也就是说,它们是DSP的代码形式,只是继续播放循环,直到被告知停止。你能想出一些解决这种波动的办法吗?