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

Flutter将WebSocket接收的图片流推送到RTMP服务器方案咨询

可行方案说明

你的需求完全可以实现,核心思路是将WebSocket接收的图片帧编码为标准视频流(如H.264),再封装成RTMP协议格式推送到服务器。下面是具体的实现路径:

一、优先方案:基于FFmpeg的实时编码推送

利用FFmpeg的管道功能,直接将内存中的图片帧传入编码流程,无需保存本地文件,兼顾实时性和灵活性。

步骤1:添加依赖

在pubspec.yaml中引入FFmpeg相关包:

dependencies:
  ffmpeg_kit_flutter: ^5.1.0

步骤2:初始化RTMP推送流程

import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter/ffmpeg_kit_config.dart';
import 'package:ffmpeg_kit_flutter/pipe.dart';

late Pipe _inputPipe;
late FFmpegKit _ffmpegSession;
int _frameTimestamp = 0;
final int _frameRate = 25; // 自定义推送帧率

void initRtmpPush(String rtmpUrl) async {
  // 创建FFmpeg输入管道,用于传递图片帧
  _inputPipe = await FFmpegKitConfig.registerNewPipe();
  
  // 构建FFmpeg命令:从管道读取图片帧、编码为H.264、推送到RTMP服务器
  final command = '-f image2pipe -framerate $_frameRate -i ${_inputPipe.getPipePath()} '
                  '-c:v libx264 -preset ultrafast -pix_fmt yuv420p '
                  '-f flv $rtmpUrl';
  
  // 启动异步编码推送
  _ffmpegSession = await FFmpegKit.executeAsync(command, (session) async {
    final returnCode = await session.getReturnCode();
    if (returnCode.isSuccess()) {
      print('RTMP推送结束:成功');
    } else {
      print('RTMP推送失败:${await session.getAllLogs()}');
    }
  });
}

步骤3:处理WebSocket接收的图片帧

void handleWebSocketFrame(Uint8List frameData) async {
  // 将图片帧写入FFmpeg输入管道
  await _inputPipe.write(frameData);
  // 控制时间戳,保证帧率稳定(可选,根据实际情况调整)
  _frameTimestamp += 1000 ~/ _frameRate;
}

步骤4:停止推送

void stopRtmpPush() async {
  await _inputPipe.close();
  await _ffmpegSession.cancel();
}

二、替代方案:扩展现有RTMP推送包

你找到的rtmp_publisher等包本质是基于原生RTMP SDK封装的,可通过修改源码或通过MethodChannel扩展,替换视频源为自定义图片帧:

  • Android端:修改原生代码,将摄像头采集逻辑替换为接收Flutter传递的图片帧,使用MediaCodec编码后通过RTMP SDK推送(可基于librtmp或rtmp-rtsp-stream-client-java)。
  • iOS端:类似Android,将摄像头输入替换为自定义CVPixelBuffer,通过LFLiveKit等SDK完成RTMP推送。

三、关键注意事项

  • 帧率控制:固定推送帧率(如25/30fps),避免服务器端出现卡顿或跳帧。
  • 编码参数:选择ultrafast等低延迟编码预设,平衡性能和实时性。
  • 格式兼容:确保图片帧格式(如JPG)被FFmpeg支持,或提前转换为RGB/YUV格式。
  • 权限配置:添加网络权限(INTERNET),并确保FFmpeg包包含libx264和flv格式支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:50:21