当前位置: 首页 > 知识库问答 >
问题:

如何在AudioTrack中播放OGG数据

卫骏
2023-03-14

我正在使用图书馆org。gagravarr:vorbis java核心:0.8(https://github.com/Gagravarr/VorbisJava).

我想从OGG文件中获取PCM数据,并使用AudioTrack播放。使用AudioTrack对我来说是一项要求,因为我以后需要在播放时连接多个PCM数据,以获得最流畅的播放效果。

正如您在下面看到的,我试图用与文件匹配的数据设置AudioTrack,用库读取文件的内容,并将其直接写入AudioTrack,但结果是播放时没有音频。

我检查了循环,确定数据读取正确。

AudioTrack track = new AudioTrack.Builder()
        .setAudioAttributes(new AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .build()
        )
        .setAudioFormat(new AudioFormat.Builder()
                .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                .setSampleRate(44100)
                .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
                .build()
        )
        .setPerformanceMode(AudioTrack.PERFORMANCE_MODE_LOW_LATENCY)
        .build();

FileInputStream fileInputStream = new FileInputStream(
        this.currentSong.getTrackFile("03")
);

OggFile oggFile = new OggFile(fileInputStream);
OggPacketReader oggPacketReader = oggFile.getPacketReader();

int written = 0;
while (true) {
    OggPacket oggPacket = oggPacketReader.getNextPacket();
    if (oggPacket == null) break;
    byte[] data = oggPacket.getData();
    track.write(data, written, data.length);
    written += data.length;
}
track.play();

我是否为此使用了适当的库?我最近看到了一种叫做MediaCodec的东西来使用低级编解码器,但我不知道从哪里开始...

共有1个答案

元嘉木
2023-03-14

目前,AudioTrack不支持Vorbis格式。因此,您需要先将源音频曲目解码为原始PCM,然后再将其送入音频曲目

这可以使用媒体提取器媒体编解码器(解码器)来完成。

链接:

https://developer.android.com/reference/android/media/MediaExtractor

https://developer.android.com/reference/android/media/MediaCodec#asynchronous-processing-using-buffers

 类似资料:
  • 我试图使用Java声音(与MP3SPI和VorbisSPI一起)从WAV、MP3和OGG文件中读取音频数据,并将其存储到字节数组中,以便以后从那里播放。为了做到这一点,我使用如下代码: Sound类基本上是一个(Byte[]样本,AudioFormat格式)耦合。完成后,我尝试读取和播放字节数组,如下所示:

  • 我希望我的应用程序从SD卡播放. ogg音频文件,但媒体播放器和SoundPool无法为某些特定的ogg文件执行此操作。我有问题要播放的示例声音属于Telegram。下面的代码适用于其他ogg文件和mp3格式,但在播放此类声音时会给我错误。 示例文件下载链接:http://www.mediafire.com/download/fxr4z4hh7b2gv50/test.ogg 它引发以下异常:

  • 我正在使用MediaPlayer库从我的服务器流式传输一些音频文件。问题是当我想在android版本4.2中使用媒体播放器播放ogg音频文件时。2,当我用Android牛轧糖玩的时候,它是可以的。在准备ogg音频文件时出现以下错误: E/Tag:准备失败。: state=0x106 E/MediaPlayer:错误(1,-2147483648) E/MediaPlayer:错误(1,-214748

  • 这个问题让我沮丧了好一阵子。我试图使用Tarsos DSP在一个我正在为Android工作的项目上执行一些基本的信号处理。音频来自一个标准的WAV文件,是44.1K,16bit立体声。当我设置并运行Tarsos AudioDispatcher使用一个使用Android的AudioTrack输出声音的音频处理器时,我得到的是播放速度过快的静态或音频。 下面是设置音频分派器的代码 } 我编写了另一个音

  • 问题内容: 我的PCM样本很短。发挥这种效果的最佳方法是什么?格式为8000Hz,单声道,16位,大字节序。(PCM样本是在代码中生成的,而不是通过某些文件读取的) 谢谢 问题答案: 使用javax.sound.sampled包,它非常简单,但是您必须使用一些样板文件。 这是一个很好的教程:www.wikijava.org/wiki/Play_a_wave_sound_in_Java 基本上,您必

  • 我在服务器中创建了一个XML文件。它包含和标记。我获取标记并将它们作为链接显示在中。当用户点击链接时,我想播放电台应用程序中的文件。 下面是我的XML文件: 我不知道下一个活动中的链接怎么玩。 :