【问题标题】:AudioTrack/AudioRecord behaviour depends on the device?AudioTrack/AudioRecord 行为取决于设备?
【发布时间】:2014-04-30 16:02:54
【问题描述】:

我目前正在玩一个小程序,以了解更多关于 udp 数据报传输的信息。 我的脚本基于我在此处找到的示例,而我正在做的只是使用带有两个线程的 AudioTrack 和 AudioRecorder。一个从远程设备接收数据包并使用AudioTrack播放,另一个将AudioRecorder录制的数据包发送到远程设备。

经过一些测试,整个 ing 似乎运行良好,声音从 A 传输到 B 和从 B 传输到 A 没有问题。请注意我使用的两个设备是两个三星 Galaxy s4 mini(实际上它可以与任何三星设备)。然后我在华硕的变压器平板电脑和 Acer Iconia 500 之间使用它,效果很好,但噪音很小。

现在我试图让它与 Sony Xperia E 和三星 Galaxy 一起工作(肯定可以),但那里的大问题是:当声音从 xperia 传到 Galaxy 时,我听到了声音,但什么都没有另一方面,xperia 的扬声器似乎无法播放这些数据包(我在日志中看到它们已被传输)。我希望这可能是设置问题,但不确定,当我与华为设备(任何类型)通信时也会发生同样的行为。

如果您想查看我的配置和所有内容,这是我的 UDP 流式传输脚本:

    public void startStreaming() {

    Thread streamThread = new Thread(new Runnable() {
        int bytesRcv;

        @Override
        public void run() {
            int minAudioBufSize = AudioRecord.getMinBufferSize(8000,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

            byte[] datagramBuffer = new byte[512];

            DatagramPacket packet;

            InetAddress destination;
            try {
                destination = InetAddress.getByName(REMOTE_ADDRESS);
            } catch (UnknownHostException e1) {
                Log.e("Streaming", "Unknown host: " + e1.getLocalizedMessage());
                destination = null;
            }

            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    minAudioBufSize);
            Log.d("Streaming", "Recorder initialized");

            recorder.startRecording();

            while (running == true) {
                try{
                    // reading data from MIC into buffer
                    bytesRcv = recorder.read(datagramBuffer, 0,
                            datagramBuffer.length);
                    // putting buffer in the packet

                    packet = new DatagramPacket(datagramBuffer, bytesRcv,
                            destination, SERVER_PORT);
                    Log.d("Streaming", "Packet size: " + packet.getLength());
                    Log.d("Streaming", "Packet content: " + Arrays.toString(datagramBuffer));
                    socket.send(packet);
                } catch (IOException e) {
                    Log.e("Streaming",
                            "Could not send package: "
                                    + e.getLocalizedMessage());
                    running = false;
                }catch (IllegalArgumentException iae){
                    Log.e("Streaming", "Error in audio datagram" + iae.getMessage());
                    running = false;
                }

            }

        }

    });
    streamThread.start();

这是我接收数据包的脚本:

 public void startReceive() {

    Thread receiveThread = new Thread(new Runnable() {

        @Override
        public void run() {

            int audioBufSize = AudioTrack.getMinBufferSize(8000,
                    AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

            byte[] datagramBuffer = new byte[512];

            speaker = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                    8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    audioBufSize, AudioTrack.MODE_STREAM);

            speaker.play();

            while (running == true) {
                try {
                    DatagramPacket packet = new DatagramPacket(
                            datagramBuffer, datagramBuffer.length);
                    socket.receive(packet);
                    Log.d("Receiver", "Received " + packet.getLength() + " bytes");

                    // sending data to the Audiotrack obj i.e. speaker
                    speaker.write(datagramBuffer, 0, packet.getLength());
                    Log.d("Receiver", "Writing buffer content: " + Arrays.toString(datagramBuffer));

                } catch (IOException e) {
                    Log.e("Receiver",
                            "Could not send package: "
                                    + e.getLocalizedMessage());
                    running = false;
                }catch (IllegalArgumentException iae){
                    Log.e("Receiver", "Error in audio datagram" + iae.getMessage());
                    running = false;
                }
            }
        }
    });
    receiveThread.start();
}

有人已经遇到过这种问题吗?任何建议都会很棒。

谢谢

【问题讨论】:

    标签: android audio-streaming audiorecord android-audiorecord audiotrack


    【解决方案1】:

    好的,解决了,一切都与采样率和缓冲区大小有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2020-02-15
      • 2013-02-14
      • 2014-10-19
      • 2017-12-12
      相关资源
      最近更新 更多