HarmonyOS 鸿蒙Next中怎么实现“听视频”功能?

HarmonyOS 鸿蒙Next中怎么实现“听视频”功能? 实现“不播视频,只放声音”。

3 回复

参考 setmediamuted,需要在API20+操作才管用。

API version 20:增加支持设置视频播放策略,表示视频画面是否关闭。true为关闭画面,false为恢复画面。

import { deviceInfo } from '@kit.BasicServicesKit'
// 需要先判断是不是API20+
if (deviceInfo.sdkApiVersion >= 20) {
  // 启用“听视频”
  avPlayer?.setMediaMuted(media.MediaType.MEDIA_TYPE_VID, true)
  // 关闭“听视频”
  avPlayer?.setMediaMuted(media.MediaType.MEDIA_TYPE_VID, false)
}

更多关于HarmonyOS 鸿蒙Next中怎么实现“听视频”功能?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中实现“听视频”功能,核心是分离视频的音频流进行后台播放。主要使用AVSession框架和媒体播放能力。

  1. 创建AVSession:通过avSession.createAVSession()建立会话,声明媒体类型为音频。
  2. 分离音频播放:使用媒体播放器(如@ohos.multimedia.media)加载视频文件,但仅控制其音频轨道输出。
  3. 后台播放与通知:配置后台播放权限,并通过AVSession更新播放状态到控制中心,实现锁屏或退到后台后持续播放音频。
  4. 控制交互:通过AVSession的命令控制能力,响应系统统一播控中心的播放、暂停等指令。

此方案不涉及界面渲染,仅处理音频数据。

在HarmonyOS Next中实现“听视频”功能(即后台音频播放),核心在于使用AVPlayer进行媒体播放,并结合AVSession和后台任务管理来确保音频在后台持续运行。以下是关键步骤和代码示例:

1. 配置权限与后台模式

  • 权限声明:在module.json5文件中声明音频播放权限和后台持续运行权限。
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.MICROPHONE" // 如需要录音则添加
      },
      {
        "name": "ohos.permission.INTERNET" // 如需网络流媒体
      }
    ],
    "abilities": [
      {
        "name": "EntryAbility",
        "backgroundModes": ["audioPlayback"] // 声明后台音频播放能力
      }
    ]
  }
}

2. 使用AVPlayer实现音频播放

初始化AVPlayer,设置仅播放音频(关闭视频轨道),并监听播放状态。

import { avPlayer, media } from '@kit.AVPlayerKit';

// 创建AVPlayer实例
let avPlayer: avPlayer.AVPlayer | null = null;

async function initAudioPlayer(url: string) {
  avPlayer = await avPlayer.createAVPlayer();
  
  // 设置仅播放音频(关键步骤)
  avPlayer.disableVideo(); // 关闭视频渲染
  
  // 设置音频流URL(支持本地或网络路径)
  avPlayer.url = url;
  
  // 监听播放完成事件
  avPlayer.on('stateChange', (state: string) => {
    if (state === 'completed') {
      // 播放完成处理
    }
  });
}

// 开始播放
async function playAudio() {
  if (avPlayer) {
    await avPlayer.play();
  }
}

// 暂停播放
function pauseAudio() {
  avPlayer?.pause();
}

3. 管理AVSession(媒体会话)

通过AVSession系统服务控制播放,并允许锁屏界面或通知栏显示播放控件。

import { avSession } from '@kit.AVSessionKit';

let session: avSession.AVSession | null = null;

async function initAVSession() {
  // 创建AVSession
  session = await avSession.createAVSession({
    tag: 'AudioPlayback',
    type: avSession.MediaType.AUDIO
  });
  
  // 设置播放命令监听
  session.on('play', () => avPlayer?.play());
  session.on('pause', () => avPlayer?.pause());
  
  // 激活会话
  await session.activate();
}

// 更新播放状态到系统
function updatePlaybackState(isPlaying: boolean) {
  if (session) {
    session.setAVPlaybackState({
      state: isPlaying ? avSession.PlaybackState.PLAYING : avSession.PlaybackState.PAUSED
    });
  }
}

4. 后台任务持续播放

注册后台任务,确保应用退到后台时音频不中断。

import { backgroundTaskManager } from '@kit.BackgroundTaskManager';

// 申请长时任务
let delaySuspendInfo: backgroundTaskManager.DelaySuspendInfo | null = null;

async function startBackgroundTask() {
  delaySuspendInfo = await backgroundTaskManager.requestSuspendDelay(
    'Audio Background Playback'
  );
  
  // 任务到期回调
  delaySuspendInfo.on('expired', () => {
    // 处理任务到期,可暂停播放或续期
  });
}

// 结束任务
function stopBackgroundTask() {
  if (delaySuspendInfo) {
    backgroundTaskManager.cancelSuspendDelay(delaySuspendInfo.requestId);
  }
}

5. 处理音频焦点(多应用协调)

当其他应用播放音频时,自动暂停当前播放。

import { audio } from '@kit.AudioKit';

let audioManager: audio.AudioManager | null = null;

async function requestAudioFocus() {
  audioManager = await audio.getAudioManager();
  
  const focusRequest: audio.AudioInterrupt = {
    contentType: audio.ContentType.MUSIC,
    usage: audio.StreamUsage.MEDIA
  };
  
  // 申请音频焦点
  await audioManager.requestAudioFocus(focusRequest);
  
  // 监听焦点变化
  audioManager.on('audioFocusChange', (focusChange: audio.AudioFocusChange) => {
    if (focusChange === audio.AudioFocusChange.LOSS_TRANSIENT) {
      avPlayer?.pause(); // 暂时失去焦点时暂停
    }
  });
}

注意事项

  • 性能优化:长时间播放网络音频时,建议启用缓存机制。
  • 电量管理:后台播放会持续消耗电量,需在应用描述中明确说明。
  • 用户控制:应在通知栏提供清晰的播放/暂停控制,并允许用户随时停止后台播放。

通过以上步骤,即可在HarmonyOS Next中实现稳定的“听视频”功能,确保音频在后台持续播放且受系统统一管理。

回到顶部