第13章_HarmonyOs开发图解 视频 第13章 HarmonyOs开发图解 视频HarmonyOS 学习系统 | 阶段三高级深耕期学习目标序号能力1掌握 HarmonyOS 视频播放Player的完整生命周期管理2能够使用 Codec 实现视频编解码能力查询3掌握视频录制Recorder的基本配置与使用核心图解内容讲解13.1 视频能力总览HarmonyOS 视频模块提供了完整的视频处理能力涵盖三个核心方向视频编解码通过 Codec 类实现编码和解码支持查询设备编解码能力视频播放通过 Player 类实现支持播放/暂停/拖拽/倍速/循环视频录制通过 Recorder 类实现支持配置音视频源和存储属性生活化类比视频编解码就像翻译官原始视频数据每一帧像素就像一篇很长的中文文章体积庞大。编码器Encoder把它翻译成精简的英文压缩格式如 H.264体积小了很多但保留了核心含义。解码器Decoder则做反向翻译把压缩数据还原成可以显示的画面。而播放器Player就像朗读者拿着翻译好的稿子按节奏朗读播放出来。13.2 视频播放器 PlayerPlayer 是 HarmonyOS 视频播放的核心类支持多种媒体格式MP4、H.264、H.265、AAC 等。Player 的生命周期为创建 - 设置数据源 - 准备 - 播放/暂停 - 停止 - 释放。// 创建播放器并设置数据源PlayerplayernewPlayer(context);player.setSource(newSource(resources/rawfile/big_buck_bunny.mp4));// 设置视频渲染 Surface关键步骤surfaceProvider.setSurfaceCreatedCallback(newSurfaceOpsCallback(){OverridepublicvoidonSurfaceCreated(SurfaceOpssurfaceOps){player.setVideoSurface(surfaceOps.getSurface());}});// 准备并播放player.prepare();player.play();// 设置播放速度0.75x ~ 2.0xplayer.setPlaybackSpeed(1.5f);// 开启单曲循环player.enableSingleLooping(true);// 拖拽到指定位置单位微秒player.rewindTo(30000000);// 跳到30秒处// 注册播放状态回调player.setPlayerCallback(newPlayer.IPlayerCallback(){OverridepublicvoidonPrepared(){HiLog.info(TAG,准备完成);}OverridepublicvoidonPlayCompleted(){HiLog.info(TAG,播放完成);}OverridepublicvoidonError(interrorType,interrorCode){HiLog.error(TAG,播放错误: errorCode);}});13.3 视频资源释放非常重要Player 持有 Native 资源必须在 Ability 的onStop()中释放否则会导致内存泄漏。OverrideprotectedvoidonStop(){super.onStop();if(player!null){player.stop();player.release();playernull;}}13.4 视频录制Recorder 类支持录制音视频并保存到文件需要配置视频源如相机、音频源如麦克风和输出格式。// 创建录制器RecorderrecordernewRecorder();// 配置录制参数RecorderConfigconfignewRecorderConfig.Builder().setVideoSource(RecorderConfig.VideoSource.VIDEO_SOURCE_SURFACE).setAudioSource(RecorderConfig.AudioSource.AUDIO_SOURCE_MIC).setOutputFormat(RecorderConfig.OutputFormat.OUTPUT_FORMAT_MPEG_4).setVideoEncoder(RecorderConfig.VideoEncoder.VIDEO_ENCODER_H264).setAudioEncoder(RecorderConfig.AudioEncoder.AUDIO_ENCODER_AAC).setVideoSize(newSize(1920,1080)).setVideoFrameRate(30).setOutputFile(newFile(path/to/output.mp4)).build();recorder.setRecorderConfig(config);recorder.prepare();recorder.start();// 开始录制// 停止录制recorder.stop();recorder.release();13.5 编解码能力查询不同设备支持的编解码器差异很大开发前务必查询设备能力// 查询设备支持的编解码格式CodecDescriptionListcodecListnewCodecDescriptionList();ListCodecDescriptionsupportedcodecList.getSupportedMimes(CodecDescription.CodecType.CODEC_TYPE_DECODER);for(CodecDescriptiondesc:supported){HiLog.info(TAG,支持格式: desc.getMimeType());}代码速查卡API功能示例Player(context)创建播放器实例new Player(context)setSource(source)设置媒体源player.setSource(new Source(path))prepare() / play() / pause() / stop()准备/播放/暂停/停止player.prepare(); player.play();rewindTo(microseconds)拖拽到指定位置player.rewindTo(30000000)setPlaybackSpeed(speed)设置播放速度player.setPlaybackSpeed(1.5f)setVideoSurface(surface)设置视频渲染 Surfaceplayer.setVideoSurface(surface)enableSingleLooping(true)开启单曲循环player.enableSingleLooping(true)setPlayerCallback(cb)注册播放状态回调player.setPlayerCallback(callback)getCurrentTime()获取当前播放位置player.getCurrentTime()与 Android/iOS 对比特性HarmonyOSAndroidiOS播放器类PlayerMediaPlayer / ExoPlayerAVPlayerSurface 渲染SurfaceProvider SurfaceOpsSurfaceView / TextureViewAVPlayerLayer倍速播放setPlaybackSpeed()setPlaybackParams()rate 属性录制类RecorderMediaRecorderAVAssetWriter编解码查询CodecDescriptionListMediaCodecListsupportedVideoTypes⚠️ 踩坑回忆录为什么视频播放黑屏我第一次写视频播放器时prepare()和play()都调用了但画面始终是黑的。排查了半天发现SurfaceProvider的回调还没触发就调了play()——Surface 还没准备好画面往哪渲染正确做法是在onSurfaceCreated回调中设置 Surface 后再 play。另外不同设备支持的编解码器差异很大一定要先用CodecDescriptionList.getSupportedMimes()查询设备能力别假设所有设备都支持 H.265。我曾在一台中端机上硬编码 H.265 播放结果只有声音没有画面。必做实操任务序号任务难度1实现一个完整的视频播放器支持播放、暂停、拖拽和倍速中2添加播放进度条实时更新播放位置中3查询当前设备的编解码能力列出支持的格式低4实现视频播放器的单曲循环和列表播放功能高5实现视频录制功能并保存到本地高学习检查清单能说出 Player 的完整生命周期创建 - 释放能正确使用 SurfaceProvider 显示视频画面知道为什么必须在 onSurfaceCreated 回调中设置 Surface能实现视频的播放、暂停、拖拽和倍速功能能正确释放 Player 资源在 onStop 中能查询设备的编解码能力了解 Recorder 的基本配置方式理解视频格式与编解码器的关系H.264、H.265 等进阶方向结合第 15 章相机能力实现自定义视频录制 App学习 HLS/DASH 流媒体协议实现网络视频播放探索视频帧的实时处理如滤镜、美颜ayer 资源在 onStop 中能查询设备的编解码能力了解 Recorder 的基本配置方式理解视频格式与编解码器的关系H.264、H.265 等进阶方向结合第 15 章相机能力实现自定义视频录制 App学习 HLS/DASH 流媒体协议实现网络视频播放探索视频帧的实时处理如滤镜、美颜