wordpress 网站统计,wordpress 删掉,网站直播间怎么做,用vue.js做网站的好处基于AVCodec能力的视频编解码
介绍
本实例基于AVCodec能力#xff0c;提供基于视频编解码的视频播放和录制的功能。
视频播放的主要流程是将视频文件通过解封装-解码-送显/播放。视频录制的主要流程是相机采集-编码-封装成mp4文件。
播放支持的原子能力规…基于AVCodec能力的视频编解码
介绍
本实例基于AVCodec能力提供基于视频编解码的视频播放和录制的功能。
视频播放的主要流程是将视频文件通过解封装-解码-送显/播放。视频录制的主要流程是相机采集-编码-封装成mp4文件。
播放支持的原子能力规格
媒体格式封装格式码流格式视频mp4视频码流H.264/H.265, 音频码流:AudioVivid视频mkv视频码流H.264/H.265, 音频码流aac/mp3/opus视频mpeg-ts视频码流H.264, 音频码流AudioVivid
录制支持的原子能力规格
封装格式视频编解码类型mp4H.264/H.265m4aAVCH.264
注意本示例仅支持视频录制未集成音频能力
效果预览 使用说明
弹出是否允许“AVCodecVideo”使用相机点击“允许”
录制
点击“录制”选取视频输出路径默认为【我的手机】文件夹下录制完成后点击“停止录制”
播放
推送视频文件至storage/media/100/local/files/Docs下或点击下方“开始录制”录制一个视频文件无音频点击播放按钮选择文件开始播放
具体实现
录制
UI层
在UI层Index页面用户点击“录制”后会调起文件管理用户选择一个输出地址。录制结束后文件会存放于此。选择好文件后会用刚刚打开的fd和用户预设的录制参数掉起ArkTS的initNative待初始化结束后调用OH_NativeWindow_GetSurfaceId接口得到NativeWindow的surfaceId并把surfaceId回调回UI层。UI层拿到编码器给的surfaceId后调起页面路由携带该surfaceId跳转到Recorder页面录制页面XComponent构建时会调起.onLoad()方法此方法首先会拿到XComponent的surfaceId然后调起createDualChannelPreview(),此函数会建立一个相机生产XComponent和编码器的surface消费的生产消费模型。
Native层
进入录制界面后编码器启动开始对UI层相机预览流进行编码。编码器每编码成功一帧sample_callback.cpp的输出回调OnNewOutputBuffer()就会调起一次此时用户会拿到AVCodec框架给出的OH_AVBuffer在输出回调中用户需手动把帧buffer、index存入输出队列中并通知输出线程解锁在输出线程中把上一步的帧信息储存为bufferInfo后pop出队在输出线程中使用上一步的bufferInfo调用封装接口WriteSample后这一帧被封装入MP4中最后调用FreeOutputBuffer接口后这一帧buffer释放回AVCodec框架实现buffer轮转。
播放
UI层
在UI层Index页面用户点击播放按钮后触发点击事件调起selectFile()函数该函数会调起文件管理的选择文件模块拿到用户选取文件的路径;用户选择文件成功后调起play()函数该函数会根据上一步获取到的路径打开一个文件并获取到该文件的大小改变按钮状态为不可用之后调起ArkTS层暴露给应用层的playNative()接口;根据playNative字段调起PlayerNative::Play()函数此处会注册播放结束的回调。播放结束时Callback()中napi_call_function()接口调起通知应用层恢复按钮状态为可用。
ArkTS层
在PlayerNative.cpp的Init()中调用PluginManager()中的Export()方法注册OnSurfaceCreatedCB()回调当屏幕上出现新的XComponent时将其转换并赋给单例类PluginManager中的pluginWindow_;
Native层 具体实现原理 解码器Start后解码器每拿到一帧OnNeedInputBuffer就会被调起一次AVCodec框架会给用户一个OH_AVBuffer。在输入回调中用户需手动把帧buffer、index存入输入队列中并同时输入线程解锁。在输入线程中把上一步的帧信息储存为bufferInfo后pop出队。在输入线程中使用上一步的bufferInfo调用ReadSample接口解封装帧数据。在输入线程中使用解封装后的bufferInfo调用解码的PushInputData接口此时这片buffer用完返回框架实现buffer轮转。PushInputData后这一帧开始解码每解码完成一帧输出回调会被调起一次用户需手动把帧buffer、index存入输出队列中。在输出线程中把上一步的帧信息储存为bufferInfo后pop出队。在输出线程中调用FreeOutputData接口后就会送显并释放buffer。释放的buffer会返回框架实现buffer轮转。 解码器config阶段OH_VideoDecoder_SetSurface接口的入参OHNativeWindow*即为PluginManager中的pluginWindow_。 解码器config阶段SetCallback接口sample_callback.cpp的输入输出回调需将回调上来的帧buffer和index存入一个用户自定义容器sample_info.h中方便后续操作。 Player.cpp的Start()起两个专门用于输入和输出的线程。
以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到 下面是鸿蒙的完整学习路线展示如下
除此之外根据这个学习鸿蒙全栈学习路线也附带一整套完整的学习【文档视频】内容包含如下 内容包含了ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战等技术知识点。帮助大家在学习鸿蒙路上快速成长 鸿蒙【北向应用开发南向系统层开发】文档
鸿蒙【基础实战项目】视频
鸿蒙面经 为了避免大家在学习过程中产生更多的时间成本对比我把以上内容全部放在了↓↓↓想要的可以自拿喔谢谢大家观看