Windows版SRS 5.0.128中Exec/Transcode调用ffmpeg失败求助
已将ffmpeg.exe复制到objs文件夹,但无法使用SRS的Exec或Transcode功能,以下是尝试的配置及错误日志:
Exec配置代码
exec { enabled on; publish ./objs/ffmpeg.exe -rtbufsize 10M -i rtmp://10.1.9.240/live/encoder -vf scale=1080:720 -c:v libx264 -profile:v high -level 4.2 -preset fast -b:v 1500k -c:a aac -ac 2 -b:a 96k -f flv -y rtmp://10.1.9.240:1935/live/encoderlow/; }
Exec错误日志
[2023-01-04 10:05:46.410][WARN][1309][01568ctu][11] EXEC: Ignore error, code=3028(FFmpegFork)(Failed to fork FFmpeg trancoder process) :
process start : vfork process failed, cli=./objs/ffmpeg.exe -rtbufsize 10M -i rtmp://10.1.9.240/live/encoder -vf scale=1080:720 -c:v libx264 -profile:v high -level 4.2 -preset fast -b:v 1500k -c:a aac -ac 2 -b:a 96k -f flv -y rtmp://10.1.9.240:1935/live/encoderlow/
thread [1309][01568ctu]: do_cycle() [./src/app/srs_app_ng_exec.cpp:108][errno=11]
thread [1309][01568ctu]: start() [./src/app/srs_app_process.cpp:197][errno=11]
Transcode配置代码
transcode { enabled on; ffmpeg ./objs/ffmpeg.exe; engine ff { enabled on; vfilter { } vcodec libx264; vthreads 4; vprofile high; vpreset fast; vbitrate 1500k; vparams { } acodec libfdk_aac; aparams { } output rtmp://127.0.0.1:[port]/[app]/[stream]_[engine]?vhost=[vhost]; } }
Transcode错误日志
[2023-01-04 11:04:45.295][WARN][1489][34r32764][11] Encoder: Ignore error, code=3028(FFmpegFork)(Failed to fork FFmpeg trancoder process) : ffmpeg start : vfork process failed, cli=./objs/ffmpeg.exe -f flv -i rtmp://127.0.0.1:1935/live?vhost=defaultVhost/encoder -vcodec libx264 -b:v 1500000 -threads 4 -profile:v high -preset fast -acodec libfdk_aac -f flv -y rtmp://127.0.0.1:1935/live/encoder_ff?vhost=defaultVhost 1 > ./objs/ffmpeg-encoder-defaultVhost-live-encoder-ff.log 2 > ./objs/ffmpeg-encoder-defaultVhost-live-encoder-ff.log
thread [1489][34r32764]: do_cycle() [./src/app/srs_app_encoder.cpp:117][errno=11]
thread [1489][34r32764]: start() [./src/app/srs_app_process.cpp:197][errno=11]
错误核心为vfork进程失败(errno=11),按以下顺序排查:
替换FFmpeg路径为绝对路径
放弃相对路径./objs/ffmpeg.exe,改用绝对路径,比如Windows环境用C:/srs/objs/ffmpeg.exe,Linux环境用/usr/local/srs/objs/ffmpeg.exe——相对路径可能因SRS启动目录不同导致找不到可执行文件。直接验证FFmpeg命令可用性
在命令行复制配置里的完整FFmpeg命令执行,比如Exec模块的命令:./objs/ffmpeg.exe -rtbufsize 10M -i rtmp://10.1.9.240/live/encoder -vf scale=1080:720 -c:v libx264 -profile:v high -level 4.2 -preset fast -b:v 1500k -c:a aac -ac 2 -b:a 96k -f flv -y rtmp://10.1.9.240:1935/live/encoderlow/如果命令本身报错,先解决FFmpeg自身问题,比如缺少编码库(如libfdk_aac)、RTMP源无法访问等。
检查权限与目录读写能力
- Windows环境:确保SRS进程有读取objs文件夹、执行ffmpeg.exe的权限,同时有权限写入错误日志里指定的ffmpeg日志文件。
- Linux环境:执行
chmod +x ./objs/ffmpeg.exe赋予可执行权限,同时确保SRS运行用户对objs目录有读写权限。
系统资源与版本兼容性
- errno=11对应
EAGAIN,可能是系统进程数限制,检查当前系统可用进程数是否充足。 - 确认FFmpeg版本与SRS版本兼容,优先使用SRS官方推荐的FFmpeg编译版本,避免用过于老旧或最新的非兼容版本。
- errno=11对应
调整编码选项适配FFmpeg能力
如果你的FFmpeg未编译libfdk_aac编码库,将Transcode配置里的acodec改为aac,避免因缺少编码库导致FFmpeg启动失败。
内容的提问来源于stack exchange,提问作者diegosn79

