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
相关产品推荐
相关产品推荐

