首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙HarmonyOS开发实战—多媒体开发(视频开发 一)

  • 25-02-22 03:41
  • 2303
  • 6281
blog.csdn.net

视频开发概述

HarmonyOS视频模块支持视频业务的开发和生态开放,开发者可以通过已开放的接口很容易地实现视频媒体的播放、操作和新功能开发。视频媒体的常见操作有视频编解码、视频合成、视频提取、视频播放以及视频录制等。

基本概念
  • 编码 编码是信息从一种形式或格式转换为另一种形式或格式的过程。用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。在本模块中,编码是指编码器将原始的视频信息压缩为另一种格式的过程。
  • 解码 解码是一种用特定方法,把数码还原成它所代表的内容或将电脉冲信号、光信号、无线电波等转换成它所代表的信息、数据等的过程。在本模块中,解码是指解码器将接收到的数据还原为视频信息的过程,与编码过程相对应。
  • 帧率 帧率是以帧为单位的位图图像连续出现在显示器上的频率(速率),以FPS(Frame per Second)为单位。

媒体编解码能力查询开发

场景介绍

媒体编解码能力查询主要指查询设备所支持的编解码器的MIME(Multipurpose Internet Mail Extensions,媒体类型)列表,并判断设备是否支持指定MIME对应的编码器/解码器。

接口说明

媒体编解码能力查询类CodecDescriptionList的主要接口

接口名

功能描述

getSupportedMimes()

获取某设备所支持的编解码器的MIME列表。

isDecodeSupportedByMime(String mime)

判断某设备是否支持指定MIME对应的解码器。

isEncodeSupportedByMime(String mime)

判断某设备是否支持指定MIME对应的编码器。

isDecoderSupportedByFormat(Format format)

判断某设备是否支持指定媒体格式对应的解码器。

isEncoderSupportedByFormat(Format format)

判断某设备是否支持指定媒体格式对应的编码器。

开发步骤

1. 调用CodecDescriptionList类的静态getSupportedMimes()方法,获取某设备所支持的编解码器的MIME列表。代码示例如下:

List<String> mimes = CodecDescriptionList.getSupportedMimes();

2. 调用CodecDescriptionList类的静态isDecodeSupportedByMime方法,判断某设备是否支持指定MIME对应的解码器,支持返回true,否则返回false。代码示例如下:

boolean result = CodecDescriptionList.isDecodeSupportedByMime(Format.VIDEO_VP9); 

3. 调用CodecDescriptionList类的静态isEncodeSupportedByMime方法,判断某设备是否支持指定MIME对应的编码器,支持返回true,否则返回false。代码示例如下:

boolean result = CodecDescriptionList.isEncodeSupportedByMime(Format.AUDIO_FLAC); 

4. 调用CodecDescriptionList类的静态isDecoderSupportedByFormat/isEncoderSupportedByFormat方法,判断某设备是否支持指定Format的编解码器,支持返回true,否则返回false。代码示例如下:

  1. Format format = new Format();
  2. format.putStringValue(Format.MIME, Format.VIDEO_AVC);
  3. format.putIntValue(Format.WIDTH, 2560);
  4. format.putIntValue(Format.HEIGHT, 1440);
  5. format.putIntValue(Format.FRAME_RATE, 30);
  6. format.putIntValue(Format.FRAME_INTERVAL, 1);
  7. boolean result = CodecDescriptionList.isDecoderSupportedByFormat(format);
  8. result = CodecDescriptionList.isEncoderSupportedByFormat(format);

视频编解码开发

场景介绍

视频编解码的主要工作是将视频进行编码和解码。

接口说明

视频编解码类Codec的主要接口

接口名

功能描述

createDecoder()

创建解码器Codec实例。

createEncoder()

创建编码器Codec实例。

registerCodecListener(ICodecListener listener)

注册侦听器用来异步接收编码或解码后的数据。

setSource(Source source, TrackInfo trackInfo)

根据解码器的源轨道信息设置数据源,对于编码器trackInfo无效。

setSourceFormat(Format format)

编码器的管道模式下,设置编码器编码格式。

setCodecFormat(Format format)

普通模式设置编/解码器参数。

setVideoSurface(Surface surface)

设置解码器的Surface。

getAvailableBuffer(long timeout)

普通模式获取可用ByteBuffer。

writeBuffer(ByteBuffer buffer, BufferInfo info)

推送源数据给Codec。

getBufferFormat(ByteBuffer buffer)

获取输出Buffer数据格式。

start()

启动编/解码。

stop()

停止编/解码。

release()

释放所有资源。

普通模式开发步骤

在普通模式下进行编解码,应用必须持续地传输数据到Codec实例。

编码的具体开发步骤如下:

1. 创建编码Codec实例,可调用createEncoder()创建。

final Codec encoder = Codec.createEncoder();

2. 构造数据源格式,并设置给Codec实例,调用setCodecFormat(),代码示例如下:

  1. Format fmt = new Format();
  2. fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
  3. fmt.putIntValue(Format.WIDTH, 1920);
  4. fmt.putIntValue(Format.HEIGHT, 1080);
  5. fmt.putIntValue(Format.BIT_RATE, 392000);
  6. fmt.putIntValue(Format.FRAME_RATE, 30);
  7. fmt.putIntValue(Format.FRAME_INTERVAL, 30);
  8. fmt.putIntValue(Format.COLOR_MODEL, 21);
  9. encoder.setCodecFormat(fmt);

3. 如果需要编码过程中,检测是否读取到Buffer数据以及是否发生异常,可以构造ICodecListener,ICodecListener需要实现两个方法,实现读到Buffer数据时、编码发生异常时做相应的操作。举例中读到Buffer时,获取buffer的format格式,异常时抛出运行时异常,代码示例如下:

  1. private HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0xD000500, "MainAblityTest");
  2. Codec.ICodecListener listener = new Codec.ICodecListener() {
  3. @Override
  4. public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
  5. Format fmt = codec.getBufferFormat(byteBuffer);
  6. }
  7. @Override
  8. public void onError(int errorCode, int act, int trackId) {
  9. HiLog.error(TAG, "CodeListener onError errorCode: %{public}d, act: %{public}d", errorCode, act);
  10. }
  11. };

4. 调用start()方法开始编码。

encoder.start();

5. 调用getAvailableBuffer()取到一个可用的ByteBuffer,把数据填入ByteBuffer里,然后再调用writeBuffer()把ByteBuffer写入编码器实例。

6. 调用stop()方法停止编码。

encoder.stop();

7. 编码任务结束后,调用release()释放资源。

encoder.release();

解码的具体开发步骤如下:

1. 创建解码Codec实例,可调用createDecoder()创建。

Codec codec = Codec.createDecoder();

2. 构造数据源格式,并设置给Codec实例,调用setCodecFormat(),代码示例如下:

  1. Format fmt = new Format();
  2. fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
  3. fmt.putIntValue(Format.WIDTH, 1920);
  4. fmt.putIntValue(Format.HEIGHT, 1080);
  5. fmt.putIntValue(Format.BIT_RATE, 392000);
  6. fmt.putIntValue(Format.FRAME_RATE, 30);
  7. fmt.putIntValue(Format.FRAME_INTERVAL, -1);
  8. fmt.putIntValue(Format.COLOR_MODEL, 21);
  9. codec.setCodecFormat(fmt);

3. (可选)如果需要解码过程中,检测是否读取到Buffer数据以及是否发生异常,可以构造ICodecListener,ICodecListener需要实现两个方法,实现读到Buffer数据时、解码发生异常时做相应的操作。举例中读到buffer时,获取buffer的format格式,异常时抛出运行时异常,代码示例如下:

  1. Codec.ICodecListener listener = new Codec.ICodecListener() {
  2. @Override
  3. public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
  4. Format fmt = codec.getBufferFormat(byteBuffer);
  5. }
  6. @Override
  7. public void onError(int errorCode, int act, int trackId) {
  8. throw new RuntimeException();
  9. }
  10. };

4. 调用 start()方法开始解码

codec.start();

5. 调用getAvailableBuffer取到一个可用的ByteBuffer,把数据填入ByteBuffer里,然后再调用writeBuffer把ByteBuffer写入解码器实例。

6. 调用 stop()方法停止解码

codec.stop();

7. 解码任务结束后,调用release()释放资源。

codec.release();

管道模式开发步骤

管道模式下应用只需要调用Source类的setSource()方法,数据会自动解析并传输给Codec实例。管道模式编码支持视频流编码和音频流编码。

编码的具体开发步骤如下:

1. 调用createEncoder()创建编码Codec实例。

2. 调用setSource()设置数据源,支持设定文件路径或者文件File Descriptor。

3. 构造数据源格式或者从Extractor中读取数据源格式,并设置给Codec实例,调用setSourceFormat(),构造数据源格式代码示例如下:

  1. String path = "/xxx/xxx//asd.mp4";
  2. boolean ret = decoder.setSource(new Source(path), null);
  3. final Codec encoder = Codec.createEncoder();
  4. Format fmt = new Format();
  5. fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
  6. fmt.putIntValue(Format.WIDTH, 1920);
  7. fmt.putIntValue(Format.HEIGHT, 1080);
  8. fmt.putIntValue(Format.BIT_RATE, 392000);
  9. fmt.putIntValue(Format.FRAME_RATE, 30);
  10. encoder.setSourceFormat(fmt);

4. 如果需要编码过程中,检测是否读取到Buffer数据以及是否发生异常,可以构造ICodecListener,ICodecListener需要实现两个方法,实现读到Buffer数据时、编码发生异常时做相应的操作。举例中读到buffer时,获取buffer的format格式,异常时抛出运行时异常,代码示例如下:

  1. Codec.ICodecListener listener = new Codec.ICodecListener() {
  2. @Override
  3. public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
  4. Format fmt = codec.getBufferFormat(byteBuffer);
  5. }
  6. @Override
  7. public void onError(int errorCode, int act, int trackId) {
  8. HiLog.error(TAG, "PlayerCallback onError errorCode: %{public}d, trackId: %{public}d", errorCode, trackId);
  9. }
  10. };

5. 调用start()方法开始编码。

6. 调用stop()方法停止编码。

7. 编码任务结束后,调用release()释放资源

解码的具体开发步骤如下:

1. 调用createDecoder()创建解码Codec实例。

2. 调用setSource()设置数据源,支持设定文件路径或者文件File Descriptor。

3. 如果需要解码过程中,检测是否读取到Buffer数据以及是否发生异常,可以构造ICodecListener,ICodecListener需要实现两个方法,实现读到Buffer数据时、解码发生异常时做相应的操作。举例中读到buffer时,获取buffer的format格式,异常时抛出运行时异常,代码示例如下:

  1. Codec.ICodecListener listener = new Codec.ICodecListener() {
  2. @Override
  3. public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
  4. Format fmt = codec.getBufferFormat(byteBuffer);
  5. }
  6. @Override
  7. public void onError(int errorCode, int act, int trackId) {
  8. throw new RuntimeException();
  9. }
  10. };

4. 调用start()方法开始解码。

5. 调用stop()方法停止解码。

6. 解码任务结束后,调用release()释放资源。


最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频、电子书、学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。

纯血版鸿蒙 HarmonyOS 4.0 视频学习资料

 需要以上视频学习资料小伙伴

请点击→纯血版全套鸿蒙HarmonyOS学习资料


《纯血版华为鸿蒙 (Harmony OS)开发手册》

这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点

纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容

HarmonyOS 概念:

  • 系统定义
  • 技术架构
  • 技术特性
  • 系统安全

如何快速入门?

  • 基本概念
  • 构建第一个ArkTS应用
  • 构建第一个JS应用
  • ……


开发基础知识: 

  • 应用基础知识
  • 配置文件
  • 应用数据管理
  • 应用安全管理
  • 应用隐私保护
  • 三方应用调用管控机制
  • 资源分类与访问
  • 学习ArkTS语言
  • ……

基于ArkTS 开发:

  • Ability开发
  • UI开发
  • 公共事件与通知
  • 窗口管理
  • 媒体
  • 安全
  • 网络与链接
  • 电话服务
  • 数据管理
  • 后台任务(Background Task)管理
  • 设备管理
  • 设备使用信息统计
  • DFX
  • 国际化开发
  • 折叠屏系列
  • .……

获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴 

请点击→纯血版全套鸿蒙HarmonyOS学习资料


?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

最新鸿蒙Next全套学习资料请扫码
微信名片
注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135698067"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top