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

简介: 视频播放开发场景介绍视频播放包括播放控制、播放设置和播放查询,如播放的开始/停止、播放速度设置和是否循环播放等。

视频播放开发

场景介绍

视频播放包括播放控制、播放设置和播放查询,如播放的开始/停止、播放速度设置和是否循环播放等。

接口说明

视频播放类Player的主要接口

image.png

开发步骤

1. 创建Player实例,可调用Player(Context context),创建本地播放器,用于在本设备播放。

2.构造数据源对象,并调用Player实例的setSource(Source source)方法,设置媒体源,代码示例如下:

1.private Context context = this;
private HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0xD000500, "MainAblityTest");
Player player = new Player(context);
File file = new File("/data/data/xxxx/files/test_audio.mp4"); // 根据实际情况设置文件路径
FileInputStream in = new FileInputStream(file);
FileDescriptor fd = in.getFD(); // 从输入流获取FD对象
Source source = new Source(fd);
player.setSource(source);
player.prepare();
player.setPlayerCallback(new Callback());
player.play();
player.stop();

3. 调用prepare(),准备播放。

4. 构造IPlayerCallback,通过IPlayerCallback,可在相应的回调函数中响应准备完毕、播放结束等事件。代码示例如下:

    public class Callback implements Player.IPlayerCallback {
        @Override
        public void onPrepared() {
            HiLog.info(TAG, "Player is now prepared,and ready to play");
        }
        @Override
        public void onMessage(int i, int i1) {
        }
        @Override
        public void onError(int errorType, int errorCode) {
            HiLog.error(TAG, "PlayerCallback onError errorType: %{public}d, errorCode: %{public}d", errorType, errorCode);
        }
        @Override
        public void onResolutionChanged(int i, int i1) {
        }
        @Override
        public void onPlayBackComplete() {
            HiLog.info(TAG, "PlayerCallback onPlayBackComplete");
        }
        @Override
        public void onRewindToComplete() {
        }
        @Override
        public void onBufferingChange(int i) {
        }
        @Override
        public void onNewTimedMetaData(Player.MediaTimedMetaData mediaTimedMetaData) {
        }
        @Override
        public void onMediaTimeIncontinuity(Player.MediaTimeInfo mediaTimeInfo) {
        }
    }

5. 调用play()方法,开始播放。


6. (可选)调用pause()方法和play()方法,可以实现暂停和恢复播放。


7. (可选)调用rewindTo(long microseconds)方法实现播放中的拖拽功能。


8. (可选)调用getDuration()方法和getCurrentTime()方法,可以实现获取总播放时长以及当前播放位置功能。


9. 调用 stop()方法停止播放。


10. 播放结束后,调用release()释放资源。


视频录制开发

场景介绍

视频录制的主要工作是选择视频/音频来源后,录制并生成视频/音频文件。


接口说明

视频录制类Recorder的主要接口

image.png

开发步骤

1. 调用Recorder()方法,创建Recorder实例。

2. 构造数据源对象,并调用Recorder实例的setSource(Source source)方法,设置媒体源,代码示例如下:

Recorder recorder = new Recorder();
Source source = new Source();
source.setRecorderAudioSource(Recorder.AudioSource.MIC);
source.setRecorderVideoSource(Recorder.VideoSource.SURFACE);
recorder.setSource(source);

3. 调用setOutputFormat(int outputFormat)方法,设置录制文件存储格式。


4. (可选)构造音频属性AudioProperty对象(不设置音频则是只录视频),并调用Recorder实例的setAudioProperty(AudioProperty property)方法,设置录制的音频属性,代码示例如下:


AudioProperty audioProperty = new AudioProperty.Builder()
                    .setRecorderNumChannels(2)
                    .setRecorderSamplingRate(192000)
                    .setRecorderAudioEncoder(Recorder.AudioEncoder.AAC)
                    .setRecorderBitRate(48000)
                    .build();
recorder.setAudioProperty(audioProperty);

5. 构造存储属性StorageProperty对象,并调用Recorder实例的setStorageProperty(StorageProperty property)方法,设置录制的存储属性,代码示例如下

String path = "/sdcard/audiotestRecord.mp4";
StorageProperty storageProperty = new StorageProperty.Builder()
                    .setRecorderPath(path)
                    .setRecorderMaxDurationMs(1000000) 
                    .setRecorderMaxFileSizeBytes(1000000) 
                    .build();
recorder.setStorageProperty(storageProperty);

6. (可选)构造视频属性VideoProperty对象,并调用Recorder实例的setVideoProperty(VideoProperty property)方法,设置录制的视频属性,代码示例如下:

VideoProperty videoProperty = new VideoProperty.Builder()
                    .setRecorderVideoEncoder(Recorder.VideoEncoder.H264)
                    .setRecorderWidth(3840)
                    .setRecorderDegrees(90)
                    .setRecorderHeight(2160)
                    .setRecorderBitRate(40000000)
                    .setRecorderRate(30)
                    .setRecorderFps(30)
                    .build();
recorder.setVideoProperty(videoProperty);
recorder.prepare();

7. 调用prepare(),准备录制。


8. (可选)构造录制回调,首先构造对象IRecorderListener,IRecorderListener需要实现onError(int what, int extra),实现录制过程收到错误信息时做相应的操作。下面的代码例子中录制异常时,打印了相关的日志信息,代码示例如下:


private HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0xD000500, "MainAblityTest");
class RecorderErrorAndInfoListener implements IRecorderListener {
    @Override
    public void onError(int what, int extra) {
    }
    @Override
    public void onMessage(int what, int extra) {
    }
}
IRecorderListener listener = new RecorderErrorAndInfoListener() {
    @Override
    public void onError(int what, int extra) {
        HiLog.error(TAG, "EncodeWriteFileListener onError what:%{public}d, extra:%{public}d", what, extra);
    }
}

9. 调用start()方法,开始录制。


10. (可选)调用pause()方法和resume()方法,可以实现暂停和恢复录制。


11. 调用 stop()方法停止录制。


12. 录制结束后,调用release()释放资源。


媒体提取开发

场景介绍

媒体提取主要工作是将多媒体文件中的音视频数据进行分离,提取出音频、视频数据源。


接口说明

视频提取类Extractor的主要接口


image.png

开发步骤

1. 调用Extractor()方法创建Extractor实例。

2. 构造数据源对象,并调用Extractor实例的setSource(Source source)方法,设置媒体源,代码示例如下:

Extractor extractor = new Extractor();
File file = new File("/sdcard/test_audio.mp4"); // 根据实际情况设置文件路径
FileInputStream in = new FileInputStream(file);
FileDescriptor fd = in.getFD();
Source source = new Source(fd);
extractor.setSource(source);

3. 调用getTotalStreams()方法获取媒体的轨道数量。


4. 调用specifyStream(int id)方法选择特定轨道的数据,进行提取。


5. (可选)调用unspecifyStream(int id)方法取消选择轨道。


6. (可选)调用rewindTo(long microseconds, int mode)方法实现提取过程中的跳转指定位置。


7. 调用readBuffer(ByteBuffer buf, int offset)方法,可以实现获取提取出来的Buffer数据功能。


8. 调用next()方法,实现提取下一帧的功能。


9. (可选)调用getStreamId()方法,可以实现获取当前选择的轨道编号的功能。


10. (可选)调用getFrameTimestamp()方法,可以实现获取当前轨道内媒体数据帧时间戳的功能。


11. (可选)调用getFrameSize()方法,可以实现获取当前轨道的媒体数据帧大小的功能。


12.(可选)调用getFrameType()方法,可以实现获取当前轨道的媒体数据帧flags的功能。


提取结束后,调用release()释放资源。


相关文章
|
2月前
|
存储 JavaScript 前端开发
“纯血鸿蒙”要来了,赶紧入手学习吧
1月18日,华为宣布HarmonyOSNEXT鸿蒙星河版面向开发者开放申请,这一最新版本的鸿蒙系统也被喻为“纯血鸿蒙”。赶紧入手学习吧
174 1
|
2月前
|
JavaScript API
鸿蒙开发接口UI界面:【@ohos.mediaquery (媒体查询)】
鸿蒙开发接口UI界面:【@ohos.mediaquery (媒体查询)】
29 1
|
2月前
|
前端开发 JavaScript 开发者
鸿蒙2.0!用 JavaScript 开发鸿蒙应用
鸿蒙2.0!用 JavaScript 开发鸿蒙应用
|
2月前
|
人工智能 安全 开发者
中国移动APP启动鸿蒙原生应用开发,鸿蒙生态迎来通信领域民生应用
近日,在“鸿蒙生态全面合作签约暨开发启动仪式“上,中国移动通信有限公司在线营销服务中心宣布将与鸿蒙生态在技术互补、成果共享、商业共赢等方向进行合作,以共同推动鸿蒙智能化的移动开放生态业务发展,并正式启动中国移动APP鸿蒙原生应用及元服务开发。
|
2月前
|
开发者 索引 容器
【鸿蒙软件开发】Stage模型开发概述应用/组件级配置
【鸿蒙软件开发】Stage模型开发概述应用/组件级配置
153 0
【鸿蒙软件开发】Stage模型开发概述应用/组件级配置
|
2月前
|
存储 前端开发 IDE
【华为鸿蒙系统学习】- 如何利用鸿蒙系统进行App项目开发|自学篇
【华为鸿蒙系统学习】- 如何利用鸿蒙系统进行App项目开发|自学篇
132 0
|
2月前
|
数据管理 API 调度
【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇
【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇
306 0
|
11月前
|
IDE JavaScript API
HarmonyOS开发第一步,熟知开发工具DevEco Studio
本文主要以常见的功能点作为概述希望可以帮助到学习HarmonyOS的开发者。
291 0
|
11月前
|
开发框架 开发者 JavaScript
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 三)
子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。
|
11月前
|
开发框架
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 四)
被@Observed装饰的类,可以被观察到属性的变化;子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中是属性,这个属性同样也需要被@Observed装饰。单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。