Android视频播放数据读取的流程.docVIP

  • 27
  • 0
  • 约1.02万字
  • 约 15页
  • 2019-10-27 发布于湖北
  • 举报
Android视频播放数据读取的流程 /s/blog_645b74b90101aezn.html 这里分析Android4.0.1本地视频数据读取的流程,其他过程类似 当播放条件准备妥当之后,就要循环进行读取视频的原始数据放到MediaBuffer,将MediaBuffer中的数据输送到解码器中解码,解码后的数据放到MediaBuffer中,在将这MediaBuffer中的数据进行render显示。 本文主要侧重读取原始数据的流程,主要是代码跟踪,不夹杂个人分析,有些mpeg4的算法不懂。 1:onVideoEvent中开始读取数据,具体代码如下: void AwesomePlayer::onVideoEvent() { if (!mVideoBuffer) { MediaSource::ReadOptions options; if (mSeeking != NO_SEEK) { LOGV(seeking to %lld us (%.2f secs), mSeekTimeUs, mSeekTimeUs / 1E6); options.setSeekTo( mSeekTimeUs, mSeeking == SEEK_VIDEO_ONLY ? MediaSource::ReadOptions::SEEK_NEXT_SYNC : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); } for (;;) { status_t err = mVideoSource-read(mVideoBuffer, options); } } } 蓝色为核心代码,如果是正常读取,options为null,否则这个结构体中包含了seek到的时间和seek的模式,用于具体从文件中哪里开始读取,传入的mVideoBuffer引用用来装解码后的数据 2:蓝色部分调用的是OMXCodec::read函数,这个函数中核心的代码如下: status_t OMXCodec::read( MediaBuffer **buffer, const ReadOptions *options) { status_t err = OK; *buffer = NULL; bool seeking = false; int64_t seekTimeUs; ReadOptions::SeekMode seekMode; if (options options-getSeekTo(seekTimeUs, seekMode)) { seeking = true; } if (seeking) { CODEC_LOGV(seeking to %lld us (%.2f secs), seekTimeUs, seekTimeUs / 1E6); CHECK(seekTimeUs = 0); mSeekTimeUs = seekTimeUs; mSeekMode = seekMode; } drainInputBuffers(); size_t index = *mFilledBuffers.begin(); // A list of indices into mPortStatus[kPortIndexOutput] filled with data. mFilledBuffers.erase(mFilledBuffers.begin()); BufferInfo *info = mPortBuffers[kPortIndexOutput].editItemAt(index); CHECK_EQ((int)info-mStatus, (int)OWNED_BY_US); info-mStatus = OWNED_BY_CLIENT; info-mMediaBuffer-add_ref(); *buffer = info-mMediaBuffer; return OK; } 两点: a,drainInputBuffers开始了数据的读取; b,mFilledBu

文档评论(0)

1亿VIP精品文档

相关文档