[文章]【HarmonyOS HiSpark AI Camera试用连载】鸿蒙系统之媒体子系统——Recorder

阅读量0
0
0


之前分析了媒体子系统的主要框架,另外其中涉及的几个辅助类,这些类调用了一些封装的底层接口以帮助应用层开发者快速开发。
在应用层 applications/sample/camera/media/camera_sample.cpp 文件中,我们以Recorder为例对其主线进行分析。
首先看 main() 函数中调用 StartRecord(),
001.jpg

002.jpg

在 StartRecord() 中可以看到其所做的工作如下:
1、调用 PrepareRecorder() 即做一些准备工作:其中包括:创建 真正的(狭义的)Recorder,创建录像文件;
2、调用 recorder_->SetOutputFile() 设置(传递)录像文件的文件描述符;
3、调用 recorder_->Prepare() 以完成其内部准备工作;
4、调用 recorder_->Start() 启动录像;
5、初始化共享内存、分辨率等,以实现预览;

在函数 PrepareRecorder() 中仅调用 SampleCreateRecorder() 和 SampleGetRecordFd(),
002-2.jpg

其中 SampleGetRecordFd() 所作工作相对简单:创建录像文件以备存储压缩编码后数据流;
重心在 SampleCreateRecorder() 上,
003.jpg

004.jpg

其内部首先 new 一个 Recorder 实例,然后对该实例进行一系列的设置,所调用这些设置接口实际上是由类 Recorder 的内部类 RecorderImpl 来实现,
005.jpg

由图中代码可知,类 Recorder 的实现类 RecorderImpl 完成了所有工作,接下来详细分析该类。
类 RecorderImpl 内部持有两个重要成员:
    SourceManager sourceManager_[RECORDER_SOURCE_MAX_CNT];
    RecorderSink *recorderSink_;
先看类 RecorderSink 及其内部关键的几个函数:
006.jpg

007.jpg

008.jpg

009.jpg

可以看到类 RecorderSink 中调用了一些封装后的 muxer 底层接口,关于这些接口的声明,举摘如下:
/**
* @brief Initializes the format.
*
* You can call this function to initialize the demuxer and muxer.
* This function should always be called before other format-specific functions,
* and it can be called only once within a process.
*
* @since 1.0
* @version 1.0
*/
void FormatInit(void);

/**
* @brief Sets a callback for the muxer. For details about the callback, see {@link FormatCallback}.
*
* This function should be called after {@link FormatMuxerCreate} is successfully called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param FormatCallback Indicates the pointer to the muxer callback to set.
* @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetCallBack(void *handle, const FormatCallback *callBack);

/**
* @brief Starts the muxer.
*
* You can call this function to encapsulate media data after the muxer is created, media tracks are added,
* and related parameters are set.
*
* @param handle Indicates the pointer to the muxer context handle.
* @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerStart(void *handle);

/**
* @brief Writes data frames into the muxer.
*
* This function should be called after {@link FormatMuxerCreate} is successfully called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param frameData Indicates the pointer to the data structure {@link FormatFrame}.
* @return Returns <b>0</b> if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerWriteFrame(const void *handle, const FormatFrame *frameData);

以上都是涉及底层 muxer,类 RecorderSink 利用其完成了底层 muxer 的一系列操作,如初始化 demuxer 和 muxer、设置回调、启动muxer等。
稍后在该类中将数据格式化后输出至指定路径的录像文件中保存,(后续启动过程中可以看到在 Recorder::RecorderImpl::Start() 中调用 recorderSink_->Start(),而该 Start() 函数则调用底层接口),即通过函数 WriteData() 来实现:
    int32_t RecorderSink::WriteData(int32_t trackId, FormatFrame &frameData) const { }

至此,本篇暂分析到这里,关于 RecorderImpl 的另一个成员 sourceManager_ 以及接下来的主线,且看下回分析。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友