【问题标题】:Why this error in Android AudioTrack? AudioTrackShared: releaseBuffer: mUnreleased out of range为什么 Android AudioTrack 中出现此错误? AudioTrackShared:releaseBuffer:mUnreleased 超出范围
【发布时间】:2021-08-21 02:41:58
【问题描述】:

我正在尝试在应用之间广播音频。这是我的录音:

private var audiorecord: AudioRecord? = null
private val SAMPLER = 16000 //Sample Audio Rate
private val CHANNEL_CONFIG: Int = AudioFormat.CHANNEL_IN_MONO
private val AUDIO_FORMAT: Int = AudioFormat.ENCODING_PCM_16BIT
private var BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLER, CHANNEL_CONFIG, AUDIO_FORMAT)

    audiorecord = AudioRecord(
        MediaRecorder.AudioSource.MIC,
        SAMPLER,
        CHANNEL_CONFIG,
        AUDIO_FORMAT,
        BUFFER_SIZE
    )

通过 WebSocket 连接发送此内容并尝试在 AudioTrack 中播放我收到非音频错误:(我正在使用电话,所以我听到一些噪音,但没有声音)

A/AudioTrackShared: releaseBuffer: mUnreleased out of range, !(stepCount:4

A/libc:致命信号 6 (SIGABRT),tid 9569 (Thread-3) 中的代码 -1 (SI_QUEUE),pid 18292 (mple.testaudio2)

我的音轨:

    var BUFFER_SIZE = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_VOICE_CALL)

    val attribBuilder = AudioAttributes.Builder()
    attribBuilder.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
    attribBuilder.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)

    val attributes = attribBuilder.build()

    // Build audio format

    val afBuilder = AudioFormat.Builder()
    afBuilder.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
    afBuilder.setEncoding(AudioFormat.ENCODING_PCM_8BIT)
    afBuilder.setSampleRate(BUFFER_SIZE)

    val format = afBuilder.build()


    audioTrack = AudioTrack(
        attributes,
        format,
        BUFFER_SIZE,
        AudioTrack.MODE_STREAM,
        AudioManager.AUDIO_SESSION_ID_GENERATE
    )

我不确定音频属性和音频格式。这段代码破坏了我的应用程序。为什么?

【问题讨论】:

    标签: android android-studio kotlin voip android-broadcast


    【解决方案1】:

    一个可能的问题是您在构造函数中传递的第三个参数:

    audioTrack = AudioTrack(
        attributes,
        format,
        BUFFER_SIZE, <-- this one
        AudioTrack.MODE_STREAM,
        AudioManager.AUDIO_SESSION_ID_GENERATE
    )
    

    根据docs,这应该是以字节为单位的缓冲区大小。您正在传递BUFFER_SIZE,基于名称似乎是正确的,但该变量定义为

    var BUFFER_SIZE = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_VOICE_CALL)
    

    所以它实际上是一个采样率,而不是缓冲区大小。我建议您重命名变量,该名称颇具误导性。您可以尝试为缓冲区大小设置一个较大的数字,看看它是否能解决您的问题。

    【讨论】:

    • 显然问题出在此处:audioTrack?.write(bytes.toByteArray(), 1, 44100 -> here)。我通过了 44100,事情停止了。谢谢,我的开发朋友。
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2017-12-02
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多