在RTSP直播流上延迟到Android设备

时间:2018-07-20 09:39:56

标签: android video-streaming delay rtsp

最近,我创建了一个应用程序,该应用程序使用SurfaceView和MediaPlayer从ffserver接收RTSP实时流(mp4格式),但是,服务器输入和屏幕上显示的视频之间的延迟约为4秒,对于我的应用程序来说,已经很久了。如果有人可以建议某种Android库或其他方法来减少这种延迟,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我建议不要将Android mediaPlayer用于RTSP实时流式传输。   在内部,Android Mediaplayer使用nuplayer进行RTSP流传输。   具有缓冲机制,可以流畅播放。以下是缓冲机制的默认值。

frameworks / av / media / libmediaplayerservice / nuplayer / RTSPSource.cpp

/* Playback will continue only if it has 1s of data*/
static const int kUnderflowMarkMs   =  1000;  // 1 second

/* Playback will only start once it has 3s of data*/
static const int kPrepareMarkMs     =  3000;  // 3 seconds

/*Maximum data to be bufferred*/
static const int kOverflowMarkMs    = 10000;  // 10 seconds

NuPlayer将连续监视缓冲状态(每1秒)。请考虑以下代码段。

void NuPlayer::RTSPSource::schedulePollBuffering() {
    sp<AMessage> msg = new AMessage(kWhatPollBuffering, this);
    msg->post(1000000ll); // 1 second intervals
}

void NuPlayer::RTSPSource::onPollBuffering() {
    bool prepared, underflow, overflow, startServer, finished;
     checkBuffering(&prepared, &underflow, &overflow, &startServer, &finished);

    if (prepared && mInPreparationPhase) {
        mInPreparationPhase = false;
        notifyPrepared();
    }

    if (!mInPreparationPhase && underflow) {
        startBufferingIfNecessary();
    }

    if (haveSufficientDataOnAllTracks()) {
        stopBufferingIfNecessary();
    }

    if (overflow && mHandler != NULL) {
        mHandler->pause();
    }

    if (startServer && mHandler != NULL) {
        mHandler->resume();
    }

    if (finished && mHandler != NULL) {
        mHandler->cancelAccessUnitTimeoutCheck();
    }

    schedulePollBuffering();
}

任何时候,如果遇到下溢,它将暂停播放1秒。这将再次为您的原始延迟增加1秒的延迟。

if (!mInPreparationPhase && underflow) {
    startBufferingIfNecessary();
}

仅当有足够的数据时才会开始播放。

 if (haveSufficientDataOnAllTracks()) {
        stopBufferingIfNecessary();
    }

除此之外,即使NuDecoder也有它自己的延迟,每当它超出访问单元时,它都会暂停。

要回答您的问题,请尝试编写自己的rtsp源,并使用本机媒体编解码器进行解码和流传输。通过这种方法,我们可以达到最大1s的延迟。

引用

  

frameworks / av / media / libmediaplayerservice / nuplayer / RTSPSource.cpp

用于编写您自己的rtsp源代码。