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

如何在Dart/Flutter中监听RTMP流并实现定时录制?

解决Flutter中RTMP流录制问题

为什么你的HTTP请求方法行不通

你遇到的报错Invalid argument(s): Unsupported scheme 'rtmp' in URI rtmp://rtmp-server-rest-of-the-url翻译为:无效参数:URI rtmp://rtmp-server-rest-of-the-url中不支持协议'rtmp'。

  • Dart的http包仅支持HTTP/HTTPS协议,RTMP是独立的流媒体协议,有专属的握手、传输规则,直接用HTTP请求访问RTMP地址必然失败。
  • 退一步说,RTMP流是经过封装的流媒体数据,不是原始的MP4字节,就算能抓取到字节,直接写入文件也无法生成可正常播放的MP4。

正确方案:利用media_kit实现录制

既然你已经用media_kit实现了RTMP流播放,直接用它的录制功能是最优解——media_kit底层依赖的libmpv原生支持流媒体录制,无需额外引入其他库。

实现步骤和代码示例

  1. 确保media_kit的依赖配置正确(包括Android/iOS平台的原生依赖)。
  2. 通过libmpv的原生属性实现录制控制:
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';

// 播放器及控制器实例
late final Player player;
late final VideoController videoController;
bool isRecording = false;
File? recordingFile;

// 初始化播放器
void initPlayer() {
  player = Player();
  videoController = VideoController(player);
  // 加载目标RTMP流
  player.open(Media(widget.url));
}

// 点击录制按钮触发的方法
Future<void> startTimedRecording() async {
  if (isRecording) return;
  isRecording = true;

  // 获取本地存储路径
  final storagePath = await _getLocalStoragePath();
  recordingFile = File('$storagePath/rtmp_recording.mp4');

  // 启动录制:设置libmpv的stream-record属性为目标文件路径
  await player.setProperty('stream-record', recordingFile!.path);

  // 指定10秒后停止录制
  Future.delayed(const Duration(seconds: 10), () async {
    // 停止录制:将stream-record属性设为空字符串
    await player.setProperty('stream-record', '');
    isRecording = false;
    print('录制完成,文件路径:${recordingFile!.path}');
    // 可在此处添加录制完成后的逻辑,比如通知用户、上传文件等
  });
}

// 获取本地应用文档路径
Future<String> _getLocalStoragePath() async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

关键说明

  • stream-record是libmpv的原生属性,设置为文件路径时启动录制,设为空字符串时停止录制。
  • 录制的文件格式兼容MP4(前提是RTMP流采用H.264视频编码+AAC音频编码,这是RTMP流的常规配置)。
  • 权限注意:Android需申请存储权限(如WRITE_EXTERNAL_STORAGE或针对Android 13+的READ_MEDIA_VIDEO);iOS无需额外权限,但要确保文件路径在应用可访问的目录内。

额外优化点

  • 如果需要分段录制、暂停/继续录制,可结合libmpv的stream-record-pause属性实现。
  • 录制前可先检查RTMP流的状态,避免在流中断时启动录制导致文件损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:51:07