android - 接收 RTP 流 - AudioStream, AudioGroup

标签 android audio ffmpeg audio-streaming rtp

我想收听 RTP 音频流,但声音中的间隙很小 - 不能继续。可能是什么解决方案?我是否在 Receiver(android) 端或 Streamer(ffmpeg) 端遗漏了什么?

我正在使用 ffmpeg 流式传输 RTP 音频,

ffmpeg -f lavfi -i aevalsrc="sin(400*2*PI*t)" -ar 8000 -vcodec pcm_u8 -f rtp rtp://192.168.0.15:41954 (port changes.)

这是我相关的android代码:

AudioStream audioStream;
AudioGroup audioGroup;
@Override
public void onStart() {
    super.onStart();
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
    StrictMode.setThreadPolicy(policy);
    AudioManager audio = (AudioManager)getSystemService(AUDIO_SERVICE);
    audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
    audioGroup = new AudioGroup();
    audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
    InetAddress inetAddress;
    try {
        inetAddress = InetAddress.getByName("192.168.0.15");
        audioStream = new AudioStream(inetAddress);
        audioStream.setCodec(AudioCodec.PCMU);
        audioStream.setMode(RtpStream.MODE_NORMAL);
        InetAddress inetAddressRemote = InetAddress.getByName("192.168.0.14");
        audioStream.associate(inetAddressRemote, 6000);
        ((TextView)findViewById(R.id.tv_port)).setText("Port : " + String.valueOf(audioStream.getLocalPort()));
        audioStream.join(audioGroup);
    }
    catch ( UnknownHostException e ) {
        e.printStackTrace();
    }
    catch ( SocketException e ) {
        e.printStackTrace();
    }
}

最佳答案

回答我自己的问题,问题在于 android rtp 数据包管理。

Android 说 ... 假设数据包间隔为 50 毫秒或更短。AudioGroup source file 中.

但是,RTP 数据包以 60 毫秒的间隔发送。

这意味着 50 毫秒是不够的,这会导致如下所述的问题。

Incoming: X X X X X X Y Y Y Y Y Y X X X X X X Y Y Y Y Y Y X X X X X X
Reading : X X X X X Y Y Y Y Y X X X X X Y Y Y Y Y X X X X X Y Y Y Y Y
          ^ ^ ^ ^ ^ - - - - - - - - - - - - - - - - - - - - ^ ^ ^ ^ ^ 
          ^                                                 ^
          |                                                 |
          |---- just these overlapping packets is valid ----|
          |---- and other packets discarding due to --------|
          |---- invalid RTP headers. -----------------------|

X, Y < packets

我每 300 毫秒间隔只有一个数据包。这会产生抖动的声音。

我会为此发送一个错误报告,希望它对某人有所帮助。

对于真正想收听原始RTP流的人,我建议他们手动读取数据包并将其解码为PCM 16bit(这是android声卡支持的唯一音频格式)并将其写入AudioTrack。

关于android - 接收 RTP 流 - AudioStream, AudioGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27268928/

相关文章:

android - 测试 Android 应用程序的正确方法

ffmpeg - 用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框

android - 如何在 videoview 中显示 raw 文件夹中的 mp4 视频

android - Flutter - 从 Firebase 存储中获取所有图像

angularjs - 在 Node js 中连接两个音频文件

android - 查找Audio.Media项的路径

java - 录音时检测静音

python - 无法为 'pipe:1' 管道 :1: Invalid argument 找到合适的输出格式

php - 将 flv 与 mp3 合并,而不使用 FFMPEG 替换 flv 音频流

android:drawableLeft margin 和/或 padding