Articles of audiotrack

通过耳机播放音乐时播放扬声器的声音

我通过耳机播放AudioTrack 。 我只需要将SoundPool发送到内置扬声器,而不会中断通过耳机播放的AudioTrack 。 任何黑客歹徒?

如何使用ffmpeg改变音频节奏和音调个性?

我已经设法在我的android项目中使用ffmpeg和AudioTrack类播放音频文件。 我可以使用AudioTrack类setRate方法更改音频的速度。 但它也改变了音频的音调,我想只改变音频的速度,但我发现网上没有解决方案。 任何人都可以帮助我,因为没有这方面的支持。

AudioTrack flush()导致静态

我正在使用AudioTrack实例播放音乐。 当用户在歌曲中改变歌曲或寻找时我想在播放新数据之前刷新缓冲区。 stop()的文档似乎指导我做类似的事情: audioTrack.pause(); audioTrack.flush(); audioTrack.play(); audioTrack.write(newData, …); 但是,这通常会产生轻微的静电。 我尝试了一些解决方法。 在我的测试设备上工作的(如摆脱静态)是flush()之后的Thread.sleep(10,0)。 但它感觉非常hackish和任意,如果它不能在其他设备上工作怎么办? 此外,我不想阻止纳米片超过必要的时间。 解决这个问题的正确方法是什么?

将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的文档。 每个框架是否与样本相同? 如何为每个声音的开始/结束位置指定标记? 谢谢,