Articles of audiotrack

发出编码和解码audiologging为G711(PCMU – uLaw)格式

当我们需要stream式传输audio时,没有太多有关应用此编解码器的信息。 没有应用编解码器,我的代码就像一个build立2设备之间的通信魅力工作,但我需要在该格式的编码/解码,因为我需要stream服务器,而不是两个设备之间(我正在testing这个代码使用2设备)。 我正在寻找机会,如果你的任何人都可以看到我的问题的关键在哪里。 我已经尝试了input参数的不同configuration。 也许,我使用的编解码器是错误的(我使用Apache许可证从一个项目中获得了它们)。 这个值在播放器 – 接收器设备中设置在录音机 – 发送器中: private int port=50005; private int sampleRate = 8000 ;//44100; private int channelConfig = AudioFormat.CHANNEL_OUT_MONO; private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int minBufSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat); 注意:播放器中的CHANNEL_OUT_MONO和logging器项目中的CHANNEL_IN_MONO。 这些是我的方法: public void startStreamingEncoding() { Thread streamThread = new Thread(new Runnable() { @Override public void run() { try { […]

使用AudioTrack与AudioManager setSpeakerphoneOn

我正在使用AudioTrack播放通过UDP套接字收到的声音。 我听到很多声音,所以我决定使用AudioManager。 但是,AudioManager改变了超出应用程序界限的声音路由。 以下是我正在使用的代码。 m_amAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); m_amAudioManager.setSpeakerphoneOn(false); 这个代码的问题是,当我closures应用程序并启动音乐播放器时,声音来自前置扬声器而不是后置扬声器,我无法改变它。 要解决此问题,我决定在closures我的应用程序时添加以下行。 m_amAudioManager.setSpeakerphoneOn(true); 但是,这条线的问题是,当我接到一个电话(普通电话),默认情况下扬声器打开。 我真的需要帮助。

Android AudioTrack不播放所有示例

我使用AudioTrack来播放正弦波序列,但是当我在HTC M9上运行它时,它只播放一部分样本,播放时间是随机的。 例如,我有20个音调可以播放,但只能播放2到17.5个音调。 是的,它甚至会停止在一个基调。 这是我的代码,从另一个答案: ArrayList<double[]> samples = new ArrayList<>(); int numSamples = 0; for (final ToneSegment seg : sequence) { int num = seg.getDuration() * sampleRate / 1000; double[] sample = new double[num]; for (int i = 0; i < num; ++i) { sample[i] = Math.sin(2 * Math.PI * i * seg.getPitch() / sampleRate); […]

在Android上使用OpenSL ES通过套接字通信stream式传输MP3audio

我试图通过接入点将Android手机中的MP3stream式传输到另一款使用WiFi的Android手机。 问题是,OpenSL ES似乎只支持PCMaudio缓冲区作为源(除非使用URI)。 在发送之前,我并不是在“主”端解码一个潜在的巨大文件,而是希望让“客户端”将MP3解码成PCM。 请记住,这必须发生在文件stream,而不是简单地发送整个文件,然后解码。 有什么办法可以使用OpenSL ES来完成这个任务吗? AudioTrack? 这似乎是一个相当普遍的要求。

Androidaudio编程噩梦 – soundpool,audiotrack arrghh?

我已经构build了一个简单的音乐音序器Android应用程序,播放多个audio文件。 最初我使用SoundPool来播放MP3文件,它在2.3.4上使用旧的HTC Droid Incredible完美工作。 然后我在Galaxy Nexus上运行4.3,testing性能非常糟糕。 audio时间到处都是,有毛刺/点击/stream行音乐。 所以我花了好几天的时间让一个使用AudioTrack的播放器,包括一个mp3解码器,并且在Galaxy和HTC上都能很好地工作。 现在我刚刚在Nexus 4上运行(运行4.3),性能很糟糕 – 时间到了。 SoundPool甚至可以在此设备上提供更好的性能。 我真的很沮丧,不知道怎么做才能完成我的应用程序,所以我会很感激,如果有人可以帮助我。 我已经把我的audio播放器的一些代码示例下面。 我已经尝试了所有我能想到的方法,包括更改缓冲区大小,使用AudioTrack.MODE_STATIC等。新的Google设备具有低延迟audio,所以我的旧机器人上的一切工作方式都变得非常奇怪! 提前致谢 /** * Play note */ public void playNote(String note, float vol) { PlayThread oldThread = threadMap.get(note); if(oldThread != null) { //Cancel timer if(oldThread.timer != null) { oldThread.timer.cancel(); oldThread.timer.purge(); oldThread.timer = null; } //Stop oldThread.requestStop(); threadMap.remove(note); } //Play if […]

你如何确定Android上的audio延迟(AudioTrack)?

我有一个应用程序,我在stream模式下使用AudioTrack播放dynamic生成的audio。 该应用程序不必立即对input作出响应,所以延迟问题不会影响到程序的这一方面。 问题是我有一个animation,需要与audio尽可能精确地“同步”,似乎不同的设备有不同的时间之间的时间之间的AudioTrack停止阻止write()调用,并要求更多数据,以及何时从扬声器播放audio。 我目前的解决scheme使我得到了大部分的方法 – 我计算了我已经传递给AudioTrack ,并将其与getPlaybackHeadPosition()进行比较。 它看起来基本上像: long currentTimeInFrames = 0; while(playingAudio) { currentTimeInFrames += numberOfFramesToWrite; long delayInFrames = (currentTimeInFrames – audioTrack.getPlaybackHeadPosition()); audioTrack.write(frameBuffer,0,sampleSize); doAnimationAfterDelay(delayInFrames); } 但是, getPlaybackHeadPosition()仍然存在一些延迟, getPlaybackHeadPosition()延迟似乎没有考虑到因设备而异。 有没有办法轮询系统的AudioTrack的延迟?

Android:使用ffmpeg使用AudioTrack播放MP3文件

我已经在我的项目中集成了ffmpeg lib,我也可以获取媒体文件的信息。 但现在我必须使用ffmpeg lib在Android中使用AudioTrack类播放mp3文件。 为此,我必须将字节缓冲区传递给AudioTrack,但我不知道如何从ffmpeg获取字节缓冲区,并将其与AudioTrack一起使用。 我也想立即播放文件。 这是我在java中的音轨代码: AudioTrack track; bufferSize = AudioTrack.getMinBufferSize(44100,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT) track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, mode); //Play audio clip track.play(); while(stream_is_over){ //Copy the decoded raw buffer from native code to "buffer" ….. ………… track.write(buffer, 0, readBytes); } 任何人都可以请给我的工作代码播放MP3audio曲目的文件。 我搜查了很多,但没有find任何正确的答案。

在Android中使用OpenSL ES而不是AudioTrack应该是什么原因?

目前我正在使用AudioTrack传递来自本地层的audio数据进行播放。 看来我可以在本地层使用OpenSL ES,而不是Java中的AudioTrack。 与AudioTrack相比,OpenSL ES提供的优势是什么?

与Android AudioTrack一起使用缓冲区

我试图找出如何使用AudioTrack的缓冲区来有效地传输音乐。 我知道你可以使用写入方法排队audio,但一旦audio排队,你怎么知道剩下多less,已经使用/播放了多less? 对不起,如果这是一个基本的问题。 我理解一个缓冲区的概念,我不知道如何写一个,尤其是使用AudioTrack。

Android MediaCodec不解码所有input缓冲区

在Android 4.4.2中,我使用MediaCodec解码mp3文件。 我使用queueInputBuffer()来排队input的MP3编码帧和dequeueOutputBuffer()来获得解码的帧。 但解码器从第8帧开始解码输出(基于bufferInfo.presentationTimeUs )并跳过最初的7帧。 这种情况只出现在less数stream上,而不是所有的stream上。 而且,这种行为在许多运行中是一致的。 我想要所有帧的解码输出,我不希望任何帧跳过。 任何人都可以帮我理解为什么帧被跳过? 我保证这个stream不会被破坏。 因为我得到了第7帧的INFO_TRY_AGAIN ,所以当“dequeueOutputBuffer”返回有效的缓冲区索引时,它的显示时间总是第8帧。 以下是排队代码: Log.e(TAG, "audptOffset = "+audptOffset+"input PT = "+audpt); audcodec.queueInputBuffer(audInbufIndex, 0, audchunkSize, audpt, 0); 以下是我如何呼叫出队并写入AudioTrack: if(!audoutputDone ){ if(!waitForAudioRelease){ auoutBufIndex = audcodec.dequeueOutputBuffer(auinfo, 100); Log.e(TAG, "Output PT = " + auinfo.presentationTimeUs+"auoutBufIndex = "+auoutBufIndex); } if (auoutBufIndex >= 0) { waitForAudioRelease = true; } else if (auoutBufIndex […]