接收RTP流 - AudioStream,AudioGroup

tot*_*ten 22 audio android ffmpeg rtp audio-streaming

我想听一个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.)
Run Code Online (Sandbox Code Playgroud)

这是我的相关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();
    }
}
Run Code Online (Sandbox Code Playgroud)

tot*_*ten 7

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

Android表示... assume packet interval is 50ms or less.AudioGroup源文件中.

但是,RTP数据包以60ms的间隔发送.

这意味着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
Run Code Online (Sandbox Code Playgroud)

我每隔300毫秒只有一个数据包.这导致了紧张的声音.

我会发送一个错误报告,希望它可以帮助某人.

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