Articles of audiotrack

将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); 这段代码的问题在于,当我关闭应用程序并启动音乐播放器时,声音来自前置扬声器而不是后置扬声器,我不能以某种方式改变它。 要解决此问题,我决定在关闭应用时添加以下行。 m_amAudioManager.setSpeakerphoneOn(true); 但是对于这条线,问题是当我接到一个电话(正常通话)时,默认情况下扬声器开启。 我真的需要帮助。

Android AudioTrack不播放所有样本

我正在使用AudioTrack播放一系列正弦波,但是当我在HTC M9上运行它时,它只播放部分样本,并且它将播放多长时间是随机的。 例如,我有20个音调可以播放,但它只播放2到17.5个音调。 是的,它甚至会在音调中间停止。 这是我的代码,来自另一个答案: ArrayList 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 >> 8); } } audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, AudioTrack.MODE_STATIC); audioTrack.write(generatedSnd, 0, […]

如何播放不在url或存储空间内的音频文件的InputStream?

背景 我已成功将音频文件(3gp)上传到Google-Drive。 现在我希望能够在应用程序中播放该文件。 Google Drive API仅允许获取存储在其中的文件的输入流。 问题 在我的情况下,输入的所有MediaPlayerfunction都不可用,只有InputSteam: http://developer.android.com/reference/android/media/MediaPlayer.html#setDataSource(java.io.FileDescriptor) 我知道我可以将文件从Google-Drive保存到缓存并播放,但我想避免存储处理,并动态播放文件。 我试过的 我试图搜索这个问题,并且发现可能使用AudioTrack( 这里 )。 它也可能使用新的Jelly-Beanfunction( 这里显示,从这里find),但我不确定它是否相当低级别。 可悲的是,使用AudioTrack我听到了错误的声音(噪音)。 我还注意到MediaPlayer可以选择将dataSource设置为MediaDataSource( 这里 ),但不仅我不确定如何使用它,它还需要API 23及更高版本。 当然,我尝试使用Google-Drive中提供的url,但这仅用于其他目的,并未定向到音频文件,因此无法使用MediaPlayer。 这个问题 给定一个InputStream,是否可以使用AudioTrack或其他东西来播放音频3gp文件? 可能有支持库解决方案吗?

SoundPool“AudioFlinger无法创建曲目,状态:-12”

我有一个单按钮的Android应用程序。 单击该按钮时,应用程序开始播放(循环)SoundPool加载的声音。 再次单击该按钮时,声音停止,然后再次启动。 但问题是声音只在每隔一段时间播放。 点击第1次 – >声音开始播放 单击第二次 – >声音停止但不再开始 单击第3次 – >声音开始播放 单击第4次 – >声音停止但不开始播放 等等… 当声音没有播放时,logcat中会出现此错误: E/AudioTrack: AudioFlinger could not create track, status: -12 E/SoundPool: Error creating AudioTrack 当我删除循环(将-​​1更改为0)时,一切正常! 我正在播放的声音是MP3文件,大小为71.6 KiB。 我在Sony Xperia U上测试了这个,运行Android 4.1.2(不工作)。 但在我的华为Honor 6(Android 6.0)中,一切正常,包括循环! 我究竟做错了什么? 这是我的代码: import android.media.AudioManager; import android.media.SoundPool; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public […]

使用Android上的OpenSL ES通过套接字通信流式传输MP3音频

我正在尝试使用WiFi通过接入点将MP3从Android手机流式传输到另一部Android手机。 问题是OpenSL ES似乎只支持PCM音频缓冲区作为源(除非使用URI)。 而不是在发送之前解码“主”侧的潜在巨大文件,我宁愿让“客户端”将MP3解码为PCM。 请记住,这必须作为文件流发生,而不是简单地发送整个文件然后解码。 有没有办法使用OpenSL ES来实现这一目标? AudioTrack? 这似乎是一个相当普遍的要求。

将音频录制编码和解码为G711(PCMU – uLaw)格式

当我们需要流音频时,没有太多关于应用此编解码器的信息。 如果不应用编解码器,我的代码就像在两个设备之间建立通信的魅力一样,但我需要以该格式进行编码/解码,因为我需要与服务器进行流式处理,而不是两个设备之间的流式处理(我使用2个设备测试此代码)。 我正在寻找机会,如果你的任何人都能看到问题的关键在哪里。 我尝试了不同的输入参数配置。 也许,我使用的编解码器是错误的(我从一个带有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和录像机项目中的CHANNEL_IN_MONO。 这些是我的方法: public void startStreamingEncoding() { Thread streamThread = new Thread(new Runnable() { @Override public void run() { try { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); DatagramSocket […]

AudioTrack – 如何知道声音何时开始/结束?

我正在使用音频轨道以流模式播放不同的声音。 我想知道是否有办法知道每个声音的生命/结束时间。 我像这样创建音轨: AudioTrack tmpAudioTrack = new AudioTrack( STREAM_TYPE, SAMPLE_RATE, CHANNEL_CONFIG_TYPE, AUDIO_FORMAT_TYPE, getOptimalBufferSize(), AUDIO_TRACK_MODE);’ 并在后台线程中启动它: backround_thread = new Thread(new MyRunnable(aTrack)); backround_thread.start(); 我在runnable中写出这样的每个声音: byte generatedSnd[] = new byte[2 * beepSamples]; int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length); 可以使用任何AudioTrack API,如setNotificationMarkerPosition,setLoopPoints或setPositionNotificationPeriod来完成此任务吗? 它们是如何工作的? 每个声音可以是不同的持续时间。 我认为这是关键。 我不完全理解这些API的文档。 每个框架是否与样本相同? 如何为每个声音的开始/结束位置指定标记? 谢谢,

如何将.pcm文件转换为.wav或.mp3文件?

我目前正在开发一个具有录音和播放function的Android应用程序。 我是处理音频的新手,我在编码和格式方面遇到了一些麻烦。 我能够在我的应用程序中录制和播放音频,但在导出时我无法重现音频。 我find的唯一方法是导出我的.pcm文件并使用Audacity进行转换。 这是我记录音频的代码是: private Thread recordingThread private AudioRecord mRecorder; private boolean isRecording = false; private void startRecording() { mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, Constants.RECORDER_SAMPLERATE, Constants.RECORDER_CHANNELS, Constants.RECORDER_AUDIO_ENCODING, Constants.BufferElements2Rec * Constants.BytesPerElement); mRecorder.startRecording(); isRecording = true; recordingThread = new Thread(new Runnable() { public void run() { writeAudioDataToFile(); } }, “AudioRecorder Thread”); recordingThread.start(); } private void writeAudioDataToFile() { […]

Android音频编程的噩梦 – soundpool,audiotrack arrghh?

我已经构建了一个简单的音乐音序器Android应用程序,可播放多个音频文件。 最初我使用的是SoundPool播放mp3文件,它在2.3.4版本上与旧的HTC Droid Incredible完美配合。 然后我在运行4.3的Galaxy Nexus上进行了测试,性能非常糟糕。 整个地方的音频定时,有毛刺/点击/popup。 因此,我花了几天时间制作一个使用AudioTrack的播放器,包括一个mp3解码器,让它在Galaxy和HTC上完美运行。 现在我刚刚在Nexus 4(运行4.3)上进行了测试,性能非常糟糕 – 时机已到处。 SoundPool甚至可以在此设备上提供更好的性能。 我真的很沮丧,不知道如何完成我的应用程序,所以如果有人能帮助我,我真的很感激。 我在下面放了一些我的音频播放器的代码示例。 我已经尝试了我能想到的所有内容,包括改变缓冲区大小,使用AudioTrack.MODE_STATIC等。新的Google设备具有低延迟音频,所以我的老机器人的一切工作方式都很奇怪! 提前致谢 /** * 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:使用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); } 任何人都可以给我工作代码播放带音轨的mp3文件。 我搜索了很多,但没有find任何正确的答案。