HarmonyOS 鸿蒙Next中使用ijkplayer播放裸TS流,怎么识别dvb字幕轨道

HarmonyOS 鸿蒙Next中使用ijkplayer播放裸TS流,怎么识别dvb字幕轨道 【问题描述】:使用ijkplayer播放裸TS流,音频轨道只能识别1条,不能识别dvb字幕轨道。没找到可以识别dvb字幕的相关资料

【问题现象】:音频轨道只能识别1条,不能识别dvb字幕轨道

AVPlayer不支持直播流格式吗-华为开发者问答 | 华为开发者联盟

9 回复

多音频轨道和 DVB 字幕的排查思路类似,先用 ffprobe 看这路 TS 里到底有没有多条 audio/subtitle stream。如果 ffprobe 能识别,而 ijkplayer 只能看到一条,重点就在 FFmpeg 编译裁剪和探测参数。

建议检查:

  1. 不要使用过度精简的 module-lite 配置,确认 mpegts demuxer 以及 aac/ac3/eac3/mp2 等实际音频解码器已启用;
  2. 适当增大 probesize、analyzeduration,让 TS 里较晚出现的 PMT/ES 能被探测到;
  3. 播放前后打印 getTrackInfo/selectTrack 的结果,确认是“未探测到”还是“探测到但未暴露给上层”。DVB 字幕还要单独启用 dvbsub 相关解码/字幕链路。

更多关于HarmonyOS 鸿蒙Next中使用ijkplayer播放裸TS流,怎么识别dvb字幕轨道的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


将TS流中的DVB字幕提取为外挂字幕文件(如SRT),然后通过AVPlayer的外挂字幕功能加载,具体方法可参考外挂字幕添加示例。

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-subtitle

cke_1216.png

https://gitcode.com/openharmony/applications_app_samples/tree/master/code/DocsSample/Media/AVPlayer/AVPlayerArkTSSubtitle

传个TS流文件附件,给你解决办法。

import { media } from ‘@kit.MediaKit’; import { common } from ‘@kit.AbilityKit’;

// 创建AVPlayer实例 let avPlayer: media.AVPlayer = await media.createAVPlayer();

// 添加外挂字幕(SRT格式) let fileDescriptorSub = await this.context.resourceManager.getRawFd(‘subtitle.srt’); avPlayer.addSubtitleFromFd(fileDescriptorSub.fd, fileDescriptorSub.offset, fileDescriptorSub.length);

// 注册字幕更新回调 avPlayer.on(‘subtitleUpdate’, (info: media.SubtitleInfo) => { if (info) { let text = info.text ? info.text : ‘’; console.info(字幕内容: ${text}); } });

这样可以不

ijkplayer基于FFmpeg构建,其编译配置通过module.sh文件控制。默认使用的精简配置(module-lite.sh)为了减小库体积,大量裁剪了非常用编解码器,其中很可能未启用DVB字幕相关的解码器(dvbsub)和解复用器。这也是字幕轨道无法被识别的最常见原因。

建议你可以重新编译FFmpeg,启用DVB字幕解码器。

步骤1:先修改module.sh配置文件

在ijkplayer源码的config/module.sh中添加以下配置:

# 启用DVB字幕解码器
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=dvbsub"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=dvdsub"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=ass"

# 启用字幕相关的解复用器(确保MPEG-TS完整支持)
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"

# 启用字幕解析器
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=dvbsub"

# 确保未禁用字幕编解码器(移除可能存在的disable行)
# 检查并移除类似如下配置:
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoder=dvbsub"

步骤2:重新编译FFmpeg和ijkplayer

# 清理旧编译产物
./compile-ffmpeg.sh clean

# 重新编译FFmpeg
./compile-ffmpeg.sh all

# 编译ijkplayer
./compile-ijk.sh all

步骤3:验证DVB字幕解码器是否已启用

编译完成后,可通过以下命令确认:

ffmpeg -decoders | grep dvb

应能看到类似输出:

S… dvbsub DVB subtitles

请问老师,那多音频轨道呢?

可以通过setOption调整FFmpeg的探测和分析参数,使其更充分地解析TS流中的所有流信息

类似这样

// 启用所有流的探测
ijkMediaPlayer.
setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, 'fflags', 'genpts'
);

如果ffprobe能识别出DVB字幕流,说明TS流本身没有问题,再增加探测应该可以识别到吧

在HarmonyOS Next中,ijkplayer播放TS流时,可通过FFmpeg的AVStream的codecpar->codec_id判断是否为AV_CODEC_ID_DVB_SUBTITLE。若使用ijkplayer接口,可在onInfo回调中遍历轨道信息,检查codec_name字段是否为dvb_subtitle。需确保FFmpeg编译时启用了--enable-decoder=dvb_subtitle。鸿蒙Next下需使用对应的NDK接口获取流信息。

ijkplayer 播放裸 TS 流时无法识别 DVB 字幕,是因为其底层 FFmpeg 默认未开启对 DVB 字幕的解码与流识别支持。DVB 字幕以私有流形式存在于 TS 中,需启用对应的解复用器(如 mpegts )并链接 libzvbi 库才能解析。在 HarmonyOS Next 环境下,需自行编译 ijkplayer 并修改编译脚本,为 FFmpeg 添加 --enable-libzvbi--enable-demuxer=dvb 等选项,重新编译后即可识别内置 DVB 字幕轨。若需求简单,也可考虑使用系统 AVPlayer,其部分版本对 TS 字幕有基础支持,但不保证完整 DVB 兼容性。

回到顶部