如何在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原生支持流媒体录制,无需额外引入其他库。
实现步骤和代码示例
- 确保media_kit的依赖配置正确(包括Android/iOS平台的原生依赖)。
- 通过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
相关产品推荐
相关产品推荐

