【鸿蒙优选三方库】@ohos/ijkplayer:B 站同源播放器,啥格式都能播

系统 AVPlayer 播不了的 FLV、拉不动的 RTMP、给不出的无级倍速——@ohos/ijkplayer 全都有。它是 B 站开源播放器 ijkplayer 在鸿蒙上的官方移植,底层 FFmpeg 内核,格式兼容性是天花板级别。

📦 仓库地址 | ohpm install @ohos/ijkplayer | v2.0.10-rc.0 | LGPLv2.1+


它解决什么问题

鸿蒙上做视频播放,系统 AVPlayer 够用但不够全能:

  • 格式受限:FLV、MKV 这类容器支持不全,老课程视频播不了
  • 直播协议缺:RTMP 基本不支持,RTSP/HLS 覆盖有限
  • 倍速档位少:教育场景要 0.5x~2x 无级变速
  • 没有录制和截图:想边播边录、抓个板书都做不到

ijkplayer 在 B 站亿级 DAU 产品里打磨多年,这些能力全都是标配。@ohos/ijkplayer 把它移植到鸿蒙,用 XComponent 接入 ArkUI 渲染管线。


核心能力

能力说明
FFmpeg 内核H.264 / H.265 / AV1 等主流编码
点播格式MP4 / MKV / FLV / MOV / TS
直播协议HLS / RTSP / RTMP
软硬解码自动选择,10bit 需 API 22+
倍速播放0.5x ~ 2x+ 无级变速(API 12+)
视频录制边播边录,存相册
截屏单帧抓取
音量控制API 12+
音频中断监听API 22+,来电/其他 App 抢焦点时响应
纯音频模式不需要 XComponent

30 秒上手

ohpm install @ohos/ijkplayer

权限:播放网络视频要 ohos.permission.INTERNET;录制/截图存相册还要 ohos.permission.WRITE_IMAGEVIDEO。

import { IjkMediaPlayer } from '@ohos/ijkplayer'

@Entry
@Component
struct PlayerPage {
  private player = IjkMediaPlayer.getInstance()

  build() {
    XComponent({
      id: 'player-surface',
      type: 'SURFACE',
      libraryname: 'ijkplayer_napi',
      controller: this.player.getSurfaceController(),
    })
      .onLoad(() => {
        this.player.setOnPreparedListener(() => this.player.start())
        this.player.setOnErrorListener((what, extra) => console.error(`${what}/${extra}`))
        this.player.setDataSource('https://example.com/video.mp4')
        this.player.prepareAsync()
      })
      .width('100%').aspectRatio(16 / 9)
  }
}

常用控制:

this.player.pause()
this.player.start()
this.player.seekTo(30_000)        // 跳到 30 秒
this.player.setSpeed(1.5)         // 1.5 倍速
this.player.setVolume(0.8)
this.player.capture((path) => console.info('截图: ' + path))

社区已解决的典型问题

并发调用 stopRecord 导致崩溃(#412 / #413)
并发调 stopRecord() 时 pthread_join 崩溃,master 和 iot 分支都出现了。根因是录制线程已被 join 过一次,第二次 join 就崩。已修复。业务侧仍建议加状态锁保证串行调用,别让用户狂点按钮触发并发。

auto_mediacodec 硬解选项引入后回退(#404 / #406)
#404 新增了自动启用硬件解码的选项,但因为在某些设备/编码组合下有问题,#406 做了 Revert 回退。结论是别依赖未稳定的硬解开关,让播放器自动选择解码器,等它正式稳定后再用。

版本迭代密集(#405 ~ #416)
2.0.10 → 2.0.11-rc.0 → 2.0.12-rc.0 → 2.0.12 迭代很快。遇到问题先翻 Issue 列表,很可能已经有人踩过并修好了。生产环境优先用正式版而非 rc。


排查硬解问题的通用手法

遇到花屏、绿屏、崩溃时,显式切软解验证:

this.player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, 'mediacodec', 0)  // 关硬解
this.player.setDataSource(url)
this.player.prepareAsync()

软解正常 + 硬解异常 → 是该机型/该编码的硬解码器兼容性问题。应对:对该机型降级软解,或服务端转码成更通用的编码。


适合谁用

  • 短视频 / 中视频:点播 + 滑动切换 + 倍速
  • 直播应用:RTMP / RTSP / HLS 拉流
  • 在线教育:多格式课程视频 + 倍速 + 录制重点
  • 车载 / 工业终端:受限环境下仍要稳定播放多种格式
  • 4K / HDR 高清:硬解码省电降发热

387 个 Issue 已关闭,是鸿蒙三方库里活跃度最高的之一。播放器的问题往往和设备强相关,翻 Issue 常常比看文档更快找到答案。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐