You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术咨询:能否通过Flutter/Chewie切换m3u8流的音轨?

如何用Flutter/Chewie实现m3u8流的音轨切换?

Chewie官方文档未明确提及音轨切换功能,但它是基于video_player插件封装的,而video_player已支持音轨相关API,因此可以通过结合两者自定义实现m3u8流的音轨切换,具体步骤如下:

  • 获取音轨列表:初始化VideoPlayerController并加载m3u8流后,调用getAudioTracks()方法获取当前媒体的所有可用音轨:

    final VideoPlayerController _controller = VideoPlayerController.networkUrl(
      Uri.parse('你的m3u8流地址'),
    );
    
    // 初始化完成后获取音轨
    await _controller.initialize();
    final List<AudioTrack> audioTracks = await _controller.getAudioTracks();
    
  • 自定义Chewie控制栏:Chewie允许通过customControls参数替换默认控制栏,你可以在控制栏中添加音轨切换按钮(如下拉菜单):

    Chewie(
      controller: ChewieController(
        videoPlayerController: _controller,
        customControls: _CustomAudioTrackControls(
          audioTracks: audioTracks,
          onTrackSelected: (AudioTrack track) {
            _controller.setAudioTrack(track);
          },
        ),
        // 其他配置项(如自动播放、循环等)
      ),
    )
    
  • 实现自定义控制栏:继承Chewie的MaterialControls或CupertinoControls,添加音轨切换UI组件。示例如下:

    class _CustomAudioTrackControls extends MaterialControls {
      final List<AudioTrack> audioTracks;
      final Function(AudioTrack) onTrackSelected;
    
      _CustomAudioTrackControls({
        required this.audioTracks,
        required this.onTrackSelected,
      });
    
      @override
      Widget build(BuildContext context) {
        return Stack(
          children: [
            super.build(context),
            Positioned(
              right: 16,
              bottom: 16,
              child: PopupMenuButton<AudioTrack>(
                icon: const Icon(Icons.audiotrack, color: Colors.white),
                itemBuilder: (context) => audioTracks.map((track) {
                  return PopupMenuItem(
                    value: track,
                    child: Text(track.name ?? '音轨${track.id}'),
                  );
                }).toList(),
                onSelected: onTrackSelected,
              ),
            ),
          ],
        );
      }
    }
    
  • 注意事项:确保使用的video_player版本支持音轨API(建议使用最新稳定版),部分m3u8流可能未包含多音轨,此时getAudioTracks()会返回空列表,需要做兼容处理。

内容的提问来源于stack exchange,提问作者Sumanta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:31:40