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