[Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(四)
来源:互联网 发布:上古卷轴5男捏脸数据 编辑:程序博客网 时间:2024/09/21 08:57
MPEG2TSWriter::readMore()
回到MPEG2TSWriter里面,调用完start()函数之后,会call readMore(),
MediaCodecSource::read
mBufferQueue里面存放则encoder好的数据,通过流程图来看下,camera的raw数据是怎么送到OMX中encoder好,再送出来到这个mBufferQueue中。
status_t MediaCodecSource::read( MediaBuffer** buffer, const ReadOptions* /* options */) { Mutexed<Output>::Locked output(mOutput); *buffer = NULL; while (output->mBufferQueue.size() == 0 && !output->mEncoderReachedEOS) { output.waitForCondition(output->mCond); } if (!output->mEncoderReachedEOS) { *buffer = *output->mBufferQueue.begin(); output->mBufferQueue.erase(output->mBufferQueue.begin()); return OK; } return output->mErrorCode;}
再puller函数中对kWhatStart的处理,mSource->start之后会调用schedulePull();,
void MediaCodecSource::Puller::onMessageReceived(const sp<AMessage> &msg) { switch (msg->what()) { case kWhatStart: { sp<RefBase> obj; CHECK(msg->findObject("meta", &obj)); { Mutexed<Queue>::Locked queue(mQueue); queue->mPulling = true; } status_t err = mSource->start(static_cast<MetaData *>(obj.get())); if (err == OK) { //这开始去拉数据 schedulePull(); } .... }}void MediaCodecSource::Puller::schedulePull() { (new AMessage(kWhatPull, this))->post();}
void MediaCodecSource::Puller::onMessageReceived(const sp<AMessage> &msg) { case kWhatPull: { Mutexed<Queue>::Locked queue(mQueue); queue->mReadPendingSince = ALooper::GetNowUs(); if (!queue->mPulling) { handleEOS(); break; } queue.unlock(); MediaBuffer *mbuf = NULL; status_t err = mSource->read(&mbuf); queue.lock(); queue->mReadPendingSince = 0; // if we need to discard buffer if (!queue->mPulling || queue->mPaused || err != OK) { if (mbuf != NULL) { mbuf->release(); mbuf = NULL; } if (queue->mPulling && err == OK) { msg->post(); // if simply paused, keep pulling source break; } else if (err == ERROR_END_OF_STREAM) { ALOGV("stream ended, mbuf %p", mbuf); } else if (err != OK) { ALOGE("error %d reading stream.", err); } } if (mbuf != NULL) { queue->pushBuffer(mbuf); } queue.unlock(); //mNotify存放的就是kWhatPullerNotify,pull到了数据之后,就抛出去 if (mbuf != NULL) { mNotify->post(); msg->post(); } else { handleEOS(); } break; }
这里audioSource和CameraSource都是走的同样的flow,那么encoder是在哪里做选择的?
我们最后是从这里去拿到数据的,找这个mEncoder
可以很快找到答案,这个放在后面的文章讲 status_t err = mEncoder->getOutputBuffer(index, &outbuf);
0 0
- [Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(四)
- [Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(一)
- [Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(二)
- [Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(三)
- [Android N]MediaRecorder系列之mediaRecorder与StagefrightRecorder
- [Android N]MediaRecorder系列之初识mediaRecorder
- Android之MediaRecorder录制音频
- Android开发之使用MediaRecorder录制声音
- Android开发之使用MediaRecorder录制视频
- Android多媒体之音频、视频录制MediaRecorder
- Android开发之使用MediaRecorder录制视频
- Android开发之使用MediaRecorder录制声音
- Android音频开发之使用MediaRecorder录制
- Android开发之使用MediaRecorder录制声音
- 录制视频之MediaRecorder
- MediaRecorder之音频录制
- MediaRecorder之视频录制
- Android MediaRecorder录制音频
- Robot Framework 以及 对应的库安装
- JPEG数据转YUV数据应用实例
- java环境变量配置
- 数据结构-C++实现(二):单向链表
- [Unity基础]移动平台下的文件读写
- [Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(四)
- Uncaught TypeError: XX is not a function at HTMLInputElement.onclick
- linux命令
- selenium之 浏览器导航栏的三个按钮(back、forward、refresh)
- RunLoop总结:RunLoop基础知识
- 一个非常棒的图片 演示 iptables 与 linux的input或者nat
- 【51Nod 1201】 整数划分
- 简历里列写的一些专业技能
- 关于.NET编译的目标平台(AnyCPU,x86,x64)