首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

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

2013-03-28 
关于VideoView延时播放的问题我在一台手机上完成了264的硬编码,并打成RTP包,通过RTSP交互后,实时发送给另

关于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();
}





热点排行