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

Android端RTMP+WebSocket流录制本地MP4遇FFmpegKit报错求助

解决方案:RTMP录制报错“RTMP playback is disabled”

先修正FFmpeg命令的语法问题

你当前的命令拼接存在参数空格缺失的问题,会导致FFmpeg无法正确解析参数,这是首先要修复的:

FFmpegKit.executeAsync("-i " + "rtmp://someurl" + " -c:v copy -c:a copy " + targetFile, session -> {
    com.arthenica.ffmpegkit.SessionState mState = session.getState();
    ReturnCode returnCode = session.getReturnCode();
    
    Log.d("TAG", String.format("FFmpeg process exited with state %s and rc %s.%s", mState, returnCode, session.getFailStackTrace()));
});

注意每个参数(比如-i、流地址、编码参数、输出文件)之间必须有空格分隔。

针对“RTMP playback is disabled”错误的核心解决方案

1. 本地旁路录制(最优方案)

这个错误的本质是你的RTMP服务器禁用了流回放权限,不允许外部拉取该流。既然你是推流端,完全可以在推流的同时直接对本地采集的音视频数据进行录制,不需要从服务器拉流。

  • 实现思路:将采集到的音视频帧分两路处理:一路送入RTMP推流器发送到服务器,另一路送入FFmpeg的MP4封装器,直接保存为本地MP4文件。
  • 优势:完全绕开服务器权限限制,录制延迟极低,且音视频质量和推流完全一致。

2. 调整RTMP服务器配置

如果必须从服务器拉流录制,需要修改服务器的RTMP配置:

  • 以Nginx-RTMP为例,在对应的application配置块中添加play on;,开启流回放功能:
    rtmp {
        server {
            listen 1935;
            application live {
                live on;
                play on; # 开启回放权限
            }
        }
    }
    
  • 确认拉流地址的合法性:部分服务器要求推流和拉流地址有区分(比如推流是rtmp://server/live/stream,拉流需要携带参数rtmp://server/live/stream?play),具体格式参考你的服务器文档。
  • 检查服务器的IP白名单、权限认证规则,确保你的Android设备IP在允许列表内,或者拉流时携带了正确的认证参数。

3. 切换到WebSocket流录制

既然你是结合WebSocket推流,可以尝试直接拉取服务器输出的WebSocket流进行录制,替代RTMP拉流:

  • 如果服务器支持输出WebSocket格式的流(比如FLV或HLS over WebSocket),修改FFmpeg命令的输入地址为WebSocket地址:
    String wsUrl = "ws://your-server/stream-path";
    FFmpegKit.executeAsync("-i " + wsUrl + " -c:v copy -c:a copy " + targetFile, session -> {
        // 回调处理逻辑
    });
    
  • 具体的WebSocket流地址格式需要咨询服务器端开发人员,确认服务器是否支持该输出方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:15:28