HarmonyOS学习路之开发篇—多媒体开发(视频开发 一)

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

视频开发概述

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


基本概念

编码

编码是信息从一种形式或格式转换为另一种形式或格式的过程。用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。在本模块中,编码是指编码器将原始的视频信息压缩为另一种格式的过程。


解码

解码是一种用特定方法,把数码还原成它所代表的内容或将电脉冲信号、光信号、无线电波等转换成它所代表的信息、数据等的过程。在本模块中,解码是指解码器将接收到的数据还原为视频信息的过程,与编码过程相对应。


帧率

帧率是以帧为单位的位图图像连续出现在显示器上的频率(速率),以FPS(Frame per Second)为单位。


媒体编解码能力查询开发

场景介绍

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


接口说明

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


image.png


开发步骤

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。代码示例如下:


Format format = new Format();
format.putStringValue(Format.MIME, Format.VIDEO_AVC);        
format.putIntValue(Format.WIDTH, 2560);        
format.putIntValue(Format.HEIGHT, 1440);        
format.putIntValue(Format.FRAME_RATE, 30);        
format.putIntValue(Format.FRAME_INTERVAL, 1); 
boolean result = CodecDescriptionList.isDecoderSupportedByFormat(format); 
result = CodecDescriptionList.isEncoderSupportedByFormat(format); 

视频编解码开发

场景介绍

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

接口说明

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


image.png

image.png


普通模式开发步骤

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


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


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


final Codec encoder = Codec.createEncoder();

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


Format fmt = new Format();
fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
fmt.putIntValue(Format.WIDTH, 1920);
fmt.putIntValue(Format.HEIGHT, 1080);
fmt.putIntValue(Format.BIT_RATE, 392000);
fmt.putIntValue(Format.FRAME_RATE, 30);
fmt.putIntValue(Format.FRAME_INTERVAL, 30); 
fmt.putIntValue(Format.COLOR_MODEL, 21);
encoder.setCodecFormat(fmt);

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


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

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(),代码示例如下:


Format fmt = new Format();
fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
fmt.putIntValue(Format.WIDTH, 1920);
fmt.putIntValue(Format.HEIGHT, 1080);
fmt.putIntValue(Format.BIT_RATE, 392000);
fmt.putIntValue(Format.FRAME_RATE, 30);
fmt.putIntValue(Format.FRAME_INTERVAL, -1);
fmt.putIntValue(Format.COLOR_MODEL, 21);
codec.setCodecFormat(fmt);

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

Codec.ICodecListener listener = new Codec.ICodecListener() {
    @Override
    public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
        Format fmt = codec.getBufferFormat(byteBuffer);
    }
    @Override
    public void onError(int errorCode, int act, int trackId) {
        throw new RuntimeException();
    }
};

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(),构造数据源格式代码示例如下:

String path = "/xxx/xxx//asd.mp4";
boolean ret = decoder.setSource(new Source(path), null);
final Codec encoder = Codec.createEncoder();
Format fmt = new Format();
fmt.putStringValue(Format.MIME, Format.VIDEO_AVC);
fmt.putIntValue(Format.WIDTH, 1920);
fmt.putIntValue(Format.HEIGHT, 1080);
fmt.putIntValue(Format.BIT_RATE, 392000);
fmt.putIntValue(Format.FRAME_RATE, 30);
encoder.setSourceFormat(fmt);

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


Codec.ICodecListener listener = new Codec.ICodecListener() {
    @Override
    public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
        Format fmt = codec.getBufferFormat(byteBuffer);
    }
    @Override
    public void onError(int errorCode, int act, int trackId) {
        HiLog.error(TAG, "PlayerCallback onError errorCode: %{public}d, trackId: %{public}d", errorCode, trackId);
    }
};

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


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


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


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


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


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


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

Codec.ICodecListener listener = new Codec.ICodecListener() {
    @Override
    public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
        Format fmt = codec.getBufferFormat(byteBuffer);
    }
    @Override
    public void onError(int errorCode, int act, int trackId) {
        throw new RuntimeException();
    }
};

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


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


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


相关文章
|
3天前
鸿蒙开发:了解@Builder装饰器
@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁,有两点需要注意,一是,是用私有还是全局,取决于当前的组件的复用机制,如果多个页面都使用了,建议以全局为主;二是传参的动态更新,有更新就使用引用参数传递,没有更新按值传递即可。
50 28
|
1月前
|
存储 JSON 区块链
【HarmonyOS NEXT开发——ArkTS语言】购物商城的实现【合集】
HarmonyOS应用开发使用@Component装饰器将Home结构体标记为一个组件,意味着它可以在界面构建中被当作一个独立的UI单元来使用,并且按照其内部定义的build方法来渲染具体的界面内容。txt:string定义了一个名为Data的接口,用于规范表示产品数据的结构。src:类型为,推测是用于引用资源(可能是图片资源等)的一种特定类型,用于指定产品对应的图片资源。txt:字符串类型,用于存放产品的文字描述,比如产品名称等相关信息。price:数值类型,用于表示产品的价格信息。
61 5
|
1月前
|
开发工具 开发者 容器
【HarmonyOS NEXT开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】
从ArkTS代码架构层面而言,@Entry指明入口、@Component助力复用、@Preview便于预览,只是初窥门径,为开发流程带来些许便利。尤其动画回调与Blank组件,细节粗糙,后续定当潜心钻研,力求精进。”,字体颜色为白色,字体大小等设置与之前类似,不过动画配置有所不同,时长为。,不过这里没有看到额外的动画效果添加到这个特定的图片元素上(与前面带动画的元素对比而言)。这是一个显示文本的视图,文本内容为“奇怪的知识”,设置了字体颜色为灰色(的结构体,它代表了整个界面组件的逻辑和视图结构。
55 1
|
1月前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
112 47
Harmony OS开发-ArkTS语言速成二
|
2月前
|
缓存 API 数据安全/隐私保护
自学记录:学习HarmonyOS Location Kit构建智能定位服务
作为一名对新技术充满好奇心的开发者,我选择了HarmonyOS Next 5.0.1(API 13)作为挑战对象,深入研究其强大的定位服务API——Location Kit。从权限管理、获取当前位置、逆地理编码到地理围栏,最终成功开发了一款智能定位应用。本文将结合代码和开发过程,详细讲解如何实现这些功能,并分享遇到的挫折与兴奋时刻。希望通过我的经验,能帮助其他开发者快速上手HarmonyOS开发,共同探索更多可能性。
135 5
|
2月前
|
前端开发 API 数据库
鸿蒙开发:异步并发操作
在结合async/await进行使用的时候,有一点需要注意,await关键字必须结合async,这两个是搭配使用的,缺一不可,同步风格在使用的时候,如何获取到错误呢,毕竟没有catch方法,其实,我们可以自己创建try/catch来捕获异常。
105 3
鸿蒙开发:异步并发操作
|
2月前
|
API
鸿蒙开发:实现popup弹窗
目前提供了两种方式实现popup弹窗,主推系统实现的方式,几乎能满足我们常见的所有场景,当然了,文章毕竟有限,尽量还是以官网为主。
106 2
鸿蒙开发:实现popup弹窗
|
2月前
|
开发框架 物联网 API
HarmonyOS开发:串行通信开发详解
在电子设备和智能系统的设计中,数据通信是连接各个组件和设备的核心,串行通信作为一种基础且广泛应用的数据传输方式,因其简单、高效和成本效益高而被广泛采用。HarmonyOS作为一个全场景智能终端操作系统,不仅支持多种设备和场景,还提供了强大的开发框架和API,使得开发者能够轻松实现串行通信功能。随着技术的不断进步,串行通信技术也在不断发展。在HarmonyOS中,串行通信的开发不仅涉及到基本的数据发送和接收,还包括设备配置、错误处理和性能优化等多个方面。那么本文就来深入探讨在HarmonyOS中如何开发串行通信应用,包括串行通信的基础知识、HarmonyOS提供的API、开发步骤和实际代码示例
61 2
|
2月前
鸿蒙语言开发 几十套鸿蒙ArkTs app毕业设计及课程作业
鸿蒙语言开发 几十套鸿蒙ArkTs app毕业设计及课程作业
53 1
|
2月前
|
API
鸿蒙开发:自定义一个英文键盘
实现方式呢,有很多种,目前采用了比较简单的一种,如果大家采用网格Grid组件实现方式,也是可以的,但是需要考虑每行的边距以及数据,还有最后两行的格子占位问题。
鸿蒙开发:自定义一个英文键盘

热门文章

最新文章