最近接了个新任务,老板突然找到我,说:“你去把鸿蒙上的音视频服务模块搞定吧,看看怎么实现音视频的播放、录制和转码,还有那些元数据提取的功能。”

image.png

我心里有点咯噔一下。平时做的是鸿蒙App的普通开发,用户界面、交互什么的已经挺熟练了,但是音视频这个东西吧,一听就挺复杂的。而且是鸿蒙OS,真的是从未涉足的领域。不过,身为一个开发者,最不怕的就是挑战嘛,况且老板的要求也是要咬着牙完成的。

于是,我打开了HarmonyOS官方文档,看了下音视频模块的API,一点一点琢磨起来。

初识音视频播放

首先是音视频播放。文档中说得很清楚,想播放视频需要创建一个AVPlayer实例,然后配置播放路径、准备播放资源。老板要的功能就是在鸿蒙系统中实现一个简单的视频播放器。于是,我开始着手搞这个。

我首先创建了一个基础的页面,在这个页面中加入了视频播放的按钮。以下是关键的代码部分:

import AVPlayer from '@ohos.multimedia.avplayer';

let player = new AVPlayer();

function playVideo(videoUrl) {
    player.src = videoUrl;
    player.prepare().then(() => {
        player.play();
    }).catch((err) => {
        console.error('准备播放失败', err);
    });
}

这段代码很简洁,其实就是创建一个AVPlayer对象,设置视频路径,然后准备并播放。鸿蒙的API确实比较简单直接,一开始我还担心会不会需要很多的回调函数或者繁琐的配置,但发现其实没那么复杂。

image.png

当然,调试过程并不是一帆风顺的。起初我遇到的问题是播放视频时屏幕一片漆黑,只有声音,没有画面。后来仔细查阅文档,才发现视频的容器控件要设置合适的宽高,并且要与AVPlayer进行绑定。于是,我修改了页面布局代码,将视频显示区域的宽高比例调整到合适的范围,还设置了AVPlayer的绑定逻辑,最终让视频正常显示。

在这一部分,我还遇到了其他一些小问题,比如视频播放的网络延迟。在播放网络视频时,播放过程会卡顿,尤其是网络环境不太稳定的时候。为了优化播放体验,我加入了一些缓冲处理的逻辑,比如在视频准备播放前先进行一定时间的预加载,尽量减少卡顿带来的用户体验问题。

最终搞定后,看着视频在鸿蒙模拟器上顺利播放起来,我心里松了一口气,感觉一大步已经迈过去了。

视频录制的坑

接下来,老板说要加上音视频录制的功能。录制这个东西就更复杂了,因为涉及到权限管理、设备调用等。文档中建议使用AVRecorder,所以我就先看了如何创建录制实例。

录制的API也还算友好,以下是我实现视频录制的代码:

import AVRecorder from '@ohos.multimedia.avrecorder';

let recorder = new AVRecorder();

function startRecording() {
    recorder.prepare({
        audioSourceType: AVRecorder.AudioSourceType.MIC,
        videoSourceType: AVRecorder.VideoSourceType.SURFACE_VIEW,
        outputFormat: AVRecorder.OutputFormat.MPEG_4,
        filePath: '/data/accounts/0/appdata/video.mp4'
    }).then(() => {
        recorder.start();
    }).catch((err) => {
        console.error('录制准备失败', err);
    });
}

function stopRecording() {
    recorder.stop().then(() => {
        console.log('录制已停止');
    }).catch((err) => {
        console.error('停止录制失败', err);
    });
}

这段代码实现了一个简单的录制功能,可以开始和停止录制。但是,我在测试过程中遇到的第一个问题就是存储权限。在鸿蒙系统中,访问存储是需要特别申请权限的。如果没有设置好权限,录制的视频是无法保存的。

我花了点时间在config.json中配置了必要的权限,包括ohos.permission.MEDIA_LOCATION和ohos.permission.WRITE_USER_STORAGE,才算是解决了这个问题。

在录制的过程中,我还注意到音视频的同步问题。录制时,如果音频和视频不同步,最终的效果会非常糟糕。为了保证音视频同步,我在配置AVRecorder时,仔细调整了音频和视频的编码参数,比如比特率、采样率等。虽然文档中提供了默认的设置,但在实际应用中,默认设置并不总是能达到最佳效果,需要根据实际的录制场景进行调优。

经过几次调试和调整,最终录制功能也稳定地实现了。看着自己录制的视频能够顺利播放,心中的成就感再次油然而生。

挑战视频转码

最后,老板说:“视频转码也搞一下吧。”当时我脑袋有点炸了,因为转码听起来就很复杂。不过,文档中提到了AVTranscoder,我决定试试看。

image.png

转码其实就是把一个视频格式转换为另一种格式。我用下面的代码实现了一个简单的视频转码:

import AVTranscoder from '@ohos.multimedia.avtranscoder';

let transcoder = new AVTranscoder();

function transcodeVideo(inputFile, outputFile) {
    transcoder.configure({
        srcUri: inputFile,
        dstUri: outputFile,
        outputFormat: AVTranscoder.OutputFormat.MPEG_4
    }).then(() => {
        return transcoder.start();
    }).then(() => {
        console.log('转码完成');
    }).catch((err) => {
        console.error('转码失败', err);
    });
}

在转码过程中,最让我头疼的其实是各种文件格式的问题。在开发过程中,我测试了几个不同的视频文件,但有些格式总是报错。后来查看了官方支持的格式列表,才明白一些不常见的编码格式并不被支持。这个问题花了我不少时间,不过最终还是搞定了。

此外,转码的性能问题也是不得不考虑的。在鸿蒙设备上进行转码操作时,性能瓶颈很明显,尤其是面对高清的大文件时,转码时间非常长。为了解决这个问题,我尝试了一些优化策略,比如调整编码参数,降低视频的分辨率或者帧率,从而缩短转码时间。当然,这需要在性能和视频质量之间做一个平衡。

经过反复实验和调整,最终我找到了一套适合我们应用场景的转码参数配置,既能保证较好的视频质量,也能在合理的时间内完成转码。

收获与感想

经过几天的开发,最终我成功实现了音视频播放、录制和转码的功能,把项目跑在鸿蒙系统上,老板很满意。我自己也觉得非常有成就感。原来觉得音视频开发是个巨大的挑战,但鸿蒙的API其实已经把很多细节给封装好了,我们只需要按照步骤去做,就能逐步解决问题。

通过这次开发,我不仅学会了音视频模块的使用,还体会到鸿蒙系统对开发者的友好性。虽然过程中有些坑,但解决了之后感觉自己对鸿蒙的理解更深了一步。

在整个过程中,我还意识到,做音视频开发不仅仅是写代码,更重要的是对多媒体的理解。比如,音视频的编码、解码、格式转换,这些都是音视频开发绕不开的知识点。通过这次项目,我对这些概念有了更深入的认识。

希望未来有更多机会在鸿蒙平台上实现更酷的功能,也希望这篇文章能对想要接触鸿蒙音视频开发的朋友们有所帮助。加油吧,鸿蒙开发者们!相信我们可以利用这个平台创造出更多有趣的应用和功能。

在今后的开发中,我也会继续学习和探索音视频领域的更多知识,毕竟,技术的进步永无止境。所以希望大家关注我,一起努力~!

image.png


郝敬学
22 声望1 粉丝