You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FFmpeg推流至FFserver报错:输出无流及编码器初始化失败

解决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 fps
Error initializing output stream 0:1 -- Error while opening encoder for output stream #0:1

结合Stream mapping显示视频流被映射到mpeg1videovp8两个编码器,问题出在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

火山引擎 最新活动