标签: audiotrack

AudioTrack:如何检测声音结束?

我正在AudioTrackAndroid上播放PCM WAV声音文件(另见此处).流模式,工作线程.我想知道如何检测声音的结束,以便我可以释放并释放声音AudioTrack.write()看起来,这个调用是阻塞的 - 但它会阻塞,直到所提供数据的回放完成为止?不太确定.

是我,还是这个班级的文件严重不足?如果你碰巧有一个很好的非官方指南的链接AudioTrack,我愿意看到一个.

audio android audiotrack

2
推荐指数
1
解决办法
4690
查看次数

Android使用两个设备之间的声音获取距离

想法是Phone A同时发送声音信号和蓝牙信号,Phone B将计算两个信号之间的延迟.

在实践中,我得到了不一致的结果,延迟时间从90ms到160ms.我尽可能地尝试优化两端.

在输出端: 在AudioTrack.write和AudioTrack处于流模式之后,
一旦蓝牙和音频输出都有自己的线程
蓝牙仅输出,就会生成音调,因此它
应该在写入完成之前开始输出.

在接收端:
再次两个单独的线程
在每个AudioRecord.read之前记录系统时间

采样规格:
44.1khz
读取整个缓冲区
使用fft一次采样100个样本
考虑自初始读取后转换的样本数量()

android bluetooth fft audiorecord audiotrack

2
推荐指数
1
解决办法
1544
查看次数

将单声道转换为立体声

我正在尝试将 16 位单声道声音转换为立体声。声音存储为字节数组,因此据我了解,这意味着我一次复制两个字节。

在此输入图像描述

我这样做对吗?我生成的代码改变了频率。

编辑:

我成功生成了单音并将其存储在byte [] generatedSnd

播放单声道声音(工作):

    AudioTrack audioTrack = null;                                   // Get audio track
    try {
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                sampleRate, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, (int)numSamples*2,
                AudioTrack.MODE_STATIC);
        audioTrack.setStereoVolume(0f, 1f);
        audioTrack.write(generatedSnd, 0, generatedSnd.length);     // Load the track
        audioTrack.play();                                          // Play the track
    }
    catch (Exception e){ }
Run Code Online (Sandbox Code Playgroud)

转换为立体声:

    int monoByteArrayLength = generatedSnd.length;
    byte [] stereoGeneratedSnd = new byte[monoByteArrayLength * 2];

    stereoGeneratedSnd[0] = generatedSnd[0];
    stereoGeneratedSnd[2] = generatedSnd[0];

    for (int x=1; x<monoByteArrayLength; x+=2) {

        stereoGeneratedSnd[x*2-1] = generatedSnd[x];
        stereoGeneratedSnd[x*2+1] = generatedSnd[x];

        if …
Run Code Online (Sandbox Code Playgroud)

audio android audiotrack

2
推荐指数
1
解决办法
4558
查看次数

AudioTrack 在 Android 5.0 上停止工作

在获得带有 Lollipop 的 Android 设备后,我注意到我们为 Kitkat(和以前的版本)工作的 AudioTrack 代码完全停止工作,完全相同的代码适用于 Lollipop 之前的设备,所以我想知道我在做什么新版本做错了。AudioTrack以下是(由属性引用mTrack)的初始化方式:

protected void onCreate(Bundle savedInstanceState) {
    int bufferSize = AudioTrack.getMinBufferSize(AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT);

    mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, AUDIO_SAMPLE_RATE,
                    AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT, bufferSize,
                    AudioTrack.MODE_STREAM);
}
Run Code Online (Sandbox Code Playgroud)

以下是缓冲区的填充方式:

public void onPlayAudio(byte[] audioBuffer) {
    if (mTrack.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) {
        mTrack.play();
    }

    if (audioBuffer != null) {
        mTrack.write(audioBuffer, 0, audioBuffer.length);
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,这在 Lollipop 之前的设备上运行良好。Logcat 上没有错误,一切似乎都正常,但声音不出来(是的,我检查了音量,它一直开到最大)。所以我想知道我是否缺少更新或者我做错了什么。

我注意到AudioFormat.CHANNEL_CONFIGURATION_STEREO已被弃用,但尝试建议AudioFormat.CHANNEL_OUT_STEREO似乎并不能解决问题。

任何帮助将不胜感激。

android audiotrack android-5.0-lollipop android-5.1.1-lollipop

2
推荐指数
1
解决办法
1260
查看次数

如何增加AudioTrack的放大?

我有以下代码:

public class MainActivity extends Activity {
    private int freq = 8000;
    private AudioRecord audioRecord = null;
    private Thread Rthread = null;

    int PERMISSION_ALL = 1;
    String[] PERMISSIONS = {Manifest.permission.RECORD_AUDIO};

    private AudioTrack audioTrack = null;
    byte[] buffer = new byte[freq];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(!hasPermissions(this, PERMISSIONS)){
            ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
        }

        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        final int bufferSize = AudioRecord.getMinBufferSize(freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT);


        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                MediaRecorder.AudioEncoder.AMR_NB, bufferSize);

        audioTrack = new AudioTrack(AudioManager.ROUTE_HEADSET, freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                MediaRecorder.AudioEncoder.AMR_NB, bufferSize,
                AudioTrack.MODE_STREAM);

        LoudnessEnhancer …
Run Code Online (Sandbox Code Playgroud)

audio android audiorecord audiotrack android-audiorecord

2
推荐指数
1
解决办法
3455
查看次数

AudioTrack:从线程开始调用

我在静态模式下使用 AudioTrack 来一遍又一遍地再现相同的信号。

我按照这里的示例进行操作,有时它工作得很好,但有时它会抛出此错误并且不产生声音:

AudioTrack: start called from a thread
01-23 15:26:16.902: W/libutils.threads(1133): Thread (this=0x3973b8): don't call waitForExit() from this Thread object's thread. It's a guaranteed deadlock!
Run Code Online (Sandbox Code Playgroud)

这是源代码。我试图确保调用停止并重新加载数据以供下一次“播放”执行。

     public class SoundPlayer {
     // originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
        private int numSamples;
        private double sample[];
        private byte generatedSnd[];
        private AudioTrack audioTrack;

        public SoundPlayer(float duration, int sampleRate, double freqOfTone) {
            super();
            this.numSamples = (int) (duration * sampleRate);
            this.sample = new double[numSamples];
            this.generatedSnd = new byte[2 * numSamples];
            // fill out the array
            for (int …
Run Code Online (Sandbox Code Playgroud)

audio android audiotrack

1
推荐指数
1
解决办法
4229
查看次数