FFmpeg推流至FFserver报错:输出无流及编码器初始化失败
我来帮你一步步排查并解决这两个报错:
第一个错误:output file #0 does not contain any stream
这个问题的根源很明确——你的初始命令里只声明了ALSA音频格式,但没有指定实际的音频输入源:
原命令片段:-f alsa -c:a aac
这里-f alsa只是告诉FFmpeg音频的格式,但没有用-i指定音频设备(比如系统默认设备default),导致FFmpeg无法获取音频流,再加上FFserver的Feed通常需要音视频流同时存在,最终输出没有有效流,触发报错。
你修改后的命令已经补上了-i default,这一步是对的,这个问题已经解决,接下来处理第二个编码器错误。
第二个错误:编码器初始化失败
从日志里的关键信息可以定位问题:
[mpeg1video @ 0x561e23968400] MPEG-1/2 does not support 3/1 fpsError initializing output stream 0:1 -- Error while opening encoder for output stream #0:1
结合Stream mapping显示视频流被映射到mpeg1video和vp8两个编码器,问题出在FFserver配置与FFmpeg输入参数不匹配,具体解决步骤如下:
1. 检查并修正FFserver配置文件
找到你的FFserver配置(通常是/etc/ffserver.conf或自定义路径),重点核对<Stream>节点的参数:
- 确保帧率一致:配置里的
VideoFrameRate必须和FFmpeg命令里的-framerate 25完全相同,MPEG-1/2不支持3fps这类非标准帧率,所以要把配置里的VideoFrameRate设为25。 - 调整比特率容限:日志提示
bitrate tolerance 21333 too small for bitrate 64000,你可以在配置里增大VideoBufferSize(比如设为128000),或者在FFmpeg命令里添加-bt 100000来放宽比特率容限。 - 匹配视频分辨率:确保配置里的
VideoSize和命令里的1680x1050一致,避免编码器因分辨率不兼容报错。
示例正确的Stream配置片段:
<Stream live.mpg> Feed feed1.ffm Format mpeg VideoCodec mpeg1video VideoFrameRate 25 VideoBitRate 64000 VideoBufferSize 128000 VideoSize 1680x1050 AudioCodec mp2 AudioBitRate 128 AudioChannels 2 AudioSampleRate 48000 </Stream>
2. 调整FFmpeg命令参数
在你修改后的命令基础上,补充以下参数:
- 添加
-thread_queue_size 512解决线程队列阻塞警告(分别加在视频和音频输入前) - 明确指定输出帧率
-r 25,确保编码器接收到的帧率是MPEG-1支持的 - 添加
-bt 100000增大比特率容限,解决日志里的比特率警告
最终调整后的命令:
ffmpeg -probesize 1000M -thread_queue_size 512 -framerate 25 -video_size 1680x1050 -f x11grab -i :0.0 -thread_queue_size 512 -f alsa -i default -c:a aac -vf format=yuv420p -r 25 -bt 100000 http://localhost:8090/feed1.ffm
3. 验证音频设备正确性
如果还是有问题,可以先单独测试音频输入是否正常:
ffmpeg -f alsa -i default -t 10 test_audio.mp3
如果能生成正常的音频文件,说明音频设备没问题;如果不行,需要替换default为你的实际音频设备名(可以用arecord -l查看设备列表)。
内容的提问来源于stack exchange,提问作者0 day




