读书人

关于VideoView延时播放的有关问题

发布时间: 2013-03-28 10:20:24 作者: rapoo

关于VideoView延时播放的问题
我在一台手机上完成了264的硬编码,并打成RTP包,通过RTSP交互后,实时发送给另一台手机的Videoview,VideoView能收到并播放,但问题是,它需要有约5秒得延时才能播放,就是说我发送了5秒后,VideoView才有画面,图像质量倒是很不错,但5秒得延时实在太长了。开始我以为是我哪个环节没写对,但是我给VLC发就没有延时,所以我想VideoView因为是RTSP播放器,它可能需要缓冲5s的数据,但我也不敢肯定。请问做过VideoView的高手是否遇到同样的情况?是如何解决的?



[解决办法]

引用:
你的意思是关掉OnPrepare会关闭缓冲么?

是关掉进度条。。
[解决办法]
引用:
还有个问题,如果提取出mediaplayer,单独编译,能否在源码里去掉缓冲这一部分,不知道你了不了解?


源码在frameworks\base\media\libmedia我看一下先

mediaplayer的是模拟视频流播放的 要边下边播放 这里有个帖子
http://www.360doc.com/content/11/0303/11/573136_97697574.shtml
[解决办法]
引用:
引用:
引用:
引用:
Videoview内部是继承SurfaceView和使用MediaPlayer来实现的,用的是mMediaPlayer.prepareAsync()会缓冲数据但不会阻塞,缓冲完足够数据会调用OnPrepared。

所以缓冲是必须的,你要用户界面友好点可以加个进……


找到了是在frameworks\base\media\libstagefright\AwesomePlayer.cpp内定义的

void AwesomePlayer::onBufferingUpdate() {
Mutex::Autolock autoLock(mLock);
if (!mBufferingEventPending) {
return;
}
mBufferingEventPending = false;

if (mCachedSource != NULL) {
bool eos;
size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&eos);

if (eos) {
notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
if (mFlags & PREPARING) {
LOGV("cache has reached EOS, prepare is done.");
finishAsyncPrepare_l();
}
} else {
int64_t bitrate;
if (getBitrate(&bitrate)) {


size_t cachedSize = mCachedSource->cachedSize();
int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate;

int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
if (percentage > 100) {
percentage = 100;
}

notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
} else {
// We don't know the bitrate of the stream, use absolute size
// limits to maintain the cache.

const size_t kLowWaterMarkBytes = 40000;
const size_t kHighWaterMarkBytes = 200000;

if ((mFlags & PLAYING) && !eos
&& (cachedDataRemaining < kLowWaterMarkBytes)) {
LOGI("cache is running low (< %d) , pausing.",
kLowWaterMarkBytes);
mFlags
[解决办法]
= CACHE_UNDERRUN;
pause_l();
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
} else if (eos
[解决办法]
cachedDataRemaining > kHighWaterMarkBytes) {
if (mFlags & CACHE_UNDERRUN) {
LOGI("cache has filled up (> %d), resuming.",
kHighWaterMarkBytes);


mFlags &= ~CACHE_UNDERRUN;
play_l();
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
} else if (mFlags & PREPARING) {
LOGV("cache has filled up (> %d), prepare is done",
kHighWaterMarkBytes);
finishAsyncPrepare_l();
}
}
}
}
}

int64_t cachedDurationUs;
bool eos;
if (getCachedDuration_l(&cachedDurationUs, &eos)) {
if ((mFlags & PLAYING) && !eos
&& (cachedDurationUs < kLowWaterMarkUs)) {
LOGI("cache is running low (%.2f secs) , pausing.",
cachedDurationUs / 1E6);
mFlags
[解决办法]
= CACHE_UNDERRUN;
pause_l();
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
} else if (eos
[解决办法]
cachedDurationUs > kHighWaterMarkUs) {
if (mFlags & CACHE_UNDERRUN) {
LOGI("cache has filled up (%.2f secs), resuming.",
cachedDurationUs / 1E6);
mFlags &= ~CACHE_UNDERRUN;
play_l();
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);


} else if (mFlags & PREPARING) {
LOGV("cache has filled up (%.2f secs), prepare is done",
cachedDurationUs / 1E6);
finishAsyncPrepare_l();
}
}
}

postBufferingEvent_l();
}





读书人网 >Android

热点推荐