[Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(二)
来源:互联网 发布:阿里云搭建ss 无网 编辑:程序博客网 时间:2024/05/01 17:45
start()开始录制
前面调用了 mRecorder.prepare(); ,准备好了一切之后,现在调用start()函数,开始录制。
mRecorder.start();
status_t StagefrightRecorder::start() { ALOGV("start"); if (mOutputFd < 0) { ALOGE("Output file descriptor is invalid"); return INVALID_OPERATION; } status_t status = OK; //如果mVideoSource==VIDEO_SOURCE_SURFACE,则*mediaSource = NULL; if (mVideoSource != VIDEO_SOURCE_SURFACE) { status = prepareInternal(); if (status != OK) { return status; } } //当然mWriter不能为NULL if (mWriter == NULL) { ALOGE("File writer is not avaialble"); return UNKNOWN_ERROR; } switch (mOutputFormat) { ..... case OUTPUT_FORMAT_AMR_NB: case OUTPUT_FORMAT_AMR_WB: case OUTPUT_FORMAT_AAC_ADIF: case OUTPUT_FORMAT_AAC_ADTS: case OUTPUT_FORMAT_RTP_AVP: case OUTPUT_FORMAT_MPEG2TS: { //重点就是这里,调用writer.start()函数去开始录制 status = mWriter->start(); break; } default: { ALOGE("Unsupported output file format: %d", mOutputFormat); status = UNKNOWN_ERROR; break; } } ..... return status;}
mWriter->start();
重点看到这里: status_t err = mSource->start();
这个mSource对象,是前面这个位置赋值的:
status_t MPEG2TSWriter::addSource(const sp<IMediaSource> &source) { CHECK(!mStarted); sp<MetaData> meta = source->getFormat(); const char *mime; CHECK(meta->findCString(kKeyMIMEType, &mime)); if (strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { return ERROR_UNSUPPORTED; } //addSource的时候,sp <MediaCodecSource>指向了audioSource,和cameraSource sp<SourceInfo> info = new SourceInfo(source); mSources.push(info); return OK;}MPEG2TSWriter::SourceInfo::SourceInfo(const sp<IMediaSource> &source) : mSource(source), mLooper(new ALooper), mEOSReceived(false), mStreamType(0), mContinuityCounter(0) { mLooper->setName("MPEG2TSWriter source");
所以我们的status_t err = mSource->start();
会call到MediaCodecSource::start
MediaCodecSource::start
status_t MediaCodecSource::start(MetaData* params) { //抛了一个kWhatStart的消息出去 sp<AMessage> msg = new AMessage(kWhatStart, mReflector); msg->setObject("meta", params); return postSynchronouslyAndReturnError(msg);}
这个flow跟到后面,会引入一个puller的东西,这个其实就是一个继承自AHandler的东西。
还记得MediaRecorder系列之StagefrightRecorder录制TS流flow(一),最后要留意的一个东西吗?
//这里重点记住一下,MediaCodecSource把我们前面传过来的audioSource,cameraSource,给了mPuller构造函数做参数 if (!(mFlags & FLAG_USE_SURFACE_INPUT)) { mPuller = new Puller(source); }
MediaCodecSource::Puller::Puller(const sp<MediaSource> &source) : mSource(source), mLooper(new ALooper()), mIsAudio(false)
这mSource
即指向了audioSource和CameraSource,在kWhatStart的handle中,call了自己的start函数。
mSource->start(static_cast<MetaData *>(obj.get()));
接下来就要跑入audioSource和CameraSource各自的start函数中了,这个放到后面的章节中说~
1 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录制音频
- springMVC源码分析--AbstractUrlHandlerMapping(三)
- Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
- UVA1225 Digit Counting
- 假设检验
- RHEL6编译升级官方内核
- [Android N]MediaRecorder系列之StagefrightRecorder录制TS流flow(二)
- 学习要像加勒比海盗
- POJ1064(二分查找)
- 磁盘加密工具cryptsetup
- 视图的递归打印 解决百分之九十的UI问题
- UVA455 Periodic Strings
- 多态、类型转换、jdk、抽象类、接口、final、super关键字
- C++类内存分布
- PL/SQL远程连接数据库的操作办法