zlmediakit ffmpeg拉流代理测试
使用postman 测试zlmediakit的http api接口,发现在后台没有ffmpeg命令在执行的时候,一直退出?不明白是什么原理。测试结果如下:后台执行命令:ffmpeg -re -f video4linux2 -s 1280x720 -i /dev/video0-vcodec libx264 -f rtsp -rtsp_transport tcp rtsp://192.168.1.46
1、问题:使用postman 测试zlmediakit的http api接口,发现在后台没有ffmpeg命令在执行的时候,一直退出?不明白是什么原理。
2、测试结果如下:
不执行拉流推流动作的时候,命令执行结果如下:
"code": -1,
"msg": "ffmpeg已经退出,exit code = 1"
后台执行命令:ffmpeg -re -f video4linux2 -s 1280x720 -i /dev/video0 -vcodec libx264 -f rtsp -rtsp_transport tcp rtsp://192.168.1.46/live/test,则执行成功。
{
"code": 0,
"data": {
"key": "877040bb2706755ac328c6def39c7fcf"
}
}
3、原因分析:到底哪里的问题?
拉流就是从摄像头拉数据,推流是数据转发到的地址。推流地址是本地地址。
为什么非要依赖于ffmpeg呢?难道是没有执行权限的问题?不对不对,看看代码
问题原因:
1)查看process.cpp ffmpegsoure.cpp 源码,发现process 使用clone进行的拷贝,就是需要有个父进程存在?这个就是后台必须有个ffmpeg的原因?
2)看ffmpeg打印发现原因。ffmpeg版本不正确
### pid=317025,cmd=/usr/bin/ffmpeg -re -i rtsp://admin:qwe*123456@192.168.1.11 -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv rtsp://192.168.1.47/live/test2 #####
ffmpeg version 5.1.1-1ubuntu2.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12 (Ubuntu 12.2.0-3ubuntu1)
configuration: --prefix=/usr --extra-version=1ubuntu2.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-shared
libavutil 57. 28.100 / 57. 28.100
libavcodec 59. 37.100 / 59. 37.100
libavformat 59. 27.100 / 59. 27.100
libavdevice 59. 7.100 / 59. 7.100
libavfilter 8. 44.100 / 8. 44.100
libswscale 6. 7.100 / 6. 7.100
libswresample 4. 7.100 / 4. 7.100
libpostproc 56. 6.100 / 56. 6.100
Input #0, rtsp, from 'rtsp://admin:qwe*123456@192.168.1.11':
Metadata:
title : Media Server
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1920x1080, 25 fps, 25 tbr, 90k tbn
Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
rtsp://192.168.1.47/live/test2: Protocol not found
这个ffmpeg与我的安装版本不一致。
a、修改ffmpeg命令位置
3)重新查看打印
Process.cpp:153 run | &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2023-05-06 15:19:31.654 I [MediaServer] [325843-event poller 0] Process.cpp:180 run | start child process 330320, log file:/home/hisense/workspace/a/release/linux/Debug/ffmpeg/ffmpeg.log.330320
2023-05-06 15:19:31.654 I [MediaServer] [325843-event poller 0] FFmpegSource.cpp:103 play | /usr/local/ffmpeg/bin/ffmpeg -re -i rtsp://admin:qwe*123456@192.168.1.11 -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv rtsp://192.168.1.47/live/test2
start child process 330320, log file:/home/hisense/workspace/a/release/linux/Debug/ffmpeg/ffmpeg.log.330320
2023-05-06 15:19:31.654 I [MediaServer] [325843-event poller 0] FFmpegSource.cpp:103 play | /usr/local/ffmpeg/bin/ffmpeg -re -i rtsp://admin:qwe*123456@192.168.1.11 -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv rtsp://192.168.1.47/live/test2(一直没发现这个错误)
2023-05-06 15:19:31.658 W [MediaServer] [325843-event poller 0] RtspSession.cpp:106 onManager | RtspSession onManager :
2023-05-06 15:19:33.658 W [MediaServer] [325843-event poller 0] RtspSession.cpp:106 onManager | RtspSession onManager :
2023-05-06 15:19:35.396 W [MediaServer] [325843-event poller 0] RtspSession.cpp:192 onRtcpPacket | RtspSession onRtcpPacket :
2023-05-06 15:19:35.396 W [MediaServer] [325843-event poller 0] Stamp.cpp:296 getNtpStamp_l | rtp stamp abnormal reduced:3817468925 -> 3816894815
2023-05-06 15:19:35.396 W [MediaServer] [325843-event poller 0] RtspSession.cpp:1116 send | RtspSession send :
2023-05-06 15:19:35.396 W [MediaServer] [325843-event poller 0] RtspSession.cpp:1116 send | RtspSession send :
Last message repeated 3 times
2023-05-06 15:19:35.659 W [MediaServer] [325843-event poller 0] RtspSession.cpp:106 onManager | RtspSession onManager :
2023-05-06 15:19:37.659 W [MediaServer] [325843-event poller 0] RtspSession.cpp:106 onManager | RtspSession onManager :
2023-05-06 15:19:39.659 W [MediaServer] [325843-event poller 0] RtspSession.cpp:106 onManager | RtspSession onManager :
2023-05-06 15:19:40.418 W [MediaServer] [325843-event poller 0] RtspSession.cpp:192 onRtcpPacket | RtspSession onRtcpPacket :
2023-05-06 15:19:40.418 W [MediaServer] [325843-event poller 0] Stamp.cpp:296 getNtpStamp_l | rtp stamp abnormal reduced:3817920905 -> 3817344815
2023-05-06 15:19:40.418 W [MediaServer] [325843-event poller 0] RtspSession.cpp:1116 send | RtspSession send :
2023-05-06 15:19:40.418 W [MediaServer] [325843-event poller 0] RtspSession.cpp:1116 send | RtspSession send :
Last message repeated 3 times
2023-05-06 15:19:41.508 W [MediaServer] [325843-event poller 0] TcpClient.cpp:21 TcpClient | TcpClient contruct :
2023-05-06 15:19:41.508 W [MediaServer] [325843-event poller 0] TcpClient.cpp:53 startConnect | TcpClient startConnect :
2023-05-06 15:19:41.508 W [MediaServer] [325843-event poller 0] EventPoller.cpp:72 EventPoller | EventPoller construct
2023-05-06 15:19:41.508 W [MediaServer] [325843-event poller 0] EventPoller.cpp:72 EventPoller | EventPoller construct
Last message repeated 15 times
2023-05-06 15:19:41.508 W [MediaServer] [325843-event poller 0] EventPoller.cpp:199 async_l | take time: 45ms, thread may be overloaded
2023-05-06 15:19:41.654 I [MediaServer] [325843-event poller 0] Process.cpp:232 s_wait | process terminated, pid=330320, exit code=1
2023-05-06 15:19:41.655 D [MediaServer] [325843-event poller 0] WebApi.cpp:250 http api debug |
# request:
POST /index/api/addFFmpegSource?src_url=rtsp://admin:qwe*123456@192.168.1.11&dst_url=rtsp://192.168.1.47/live/test2&timeout_ms=10000
# header:
Accept : */*
Accept-Encoding : gzip, deflate, br
Cache-Control : no-cache
Connection : keep-alive
Content-Length : 0
Host : 127.0.0.1
Postman-Token : d3bac36e-05bc-432f-844e-017416d50622
User-Agent : PostmanRuntime/7.32.2
# content:
# response:
{
"code" : -1,
"msg" : "111 ffmpeg\u5df2\u7ecf\u9000\u51fa,exit code = 1"
}
2023-05-06 15:19:41.655 D [MediaServer] [325843-event poller 0] FFmpegSource.cpp:52 ~FFmpegSource |
4)process.cpp代码 waitpid处理不正确?
pid_t p = waitpid(pid, &status, block ? 0 : WNOHANG);
int exit_code = (status & 0xFF00) >> 8;
if (exit_code_ptr) {
*exit_code_ptr = exit_code;
}
if (p < 0) {
WarnL << "waitpid failed, pid=" << pid << ", err=" << get_uv_errmsg();
return false;
}
if (p > 0) {
InfoL << "process terminated, pid=" << pid << ", exit code=" << exit_code;
return false;
}
waitpid 的options参数的理解
该参数设置:一般设置为WNOHANG:表示为父进程是以非阻塞的方式等待子进程;
但是非阻塞方式等待子进程退出就有几种情况:
> 1.子进程没有退出,但是父进程调用的waitpid返回了0,这也表示等待子进程成功,只不过子进程没有退出,此时表示需要继续做父进程的事情;
2. 子进程退出了,f父进程调用waitpid函数返回子进程的PID, 也就是等待成功了,这时候我们在父进程可以拿到子进程的退出状态信息;
3. waitpid等待子进程退出失败,waitpid就会返回小于0的值,此时就可以做一些输出错误信息给用户;
5)查看打印,仍然是rtsp://192.168.1.47/live/test10: Protocol not found
难道是ffmpeg不支持rtsp协议?换成rtmp就可以的。
ffmpeg -protocols查看果然没有rtsp协议。如果ffmpeg 4.3.6不支持rtsp协议,那我ffmpeg命令怎么执行成功的?
执行命令截图
pid=382021,cmd=/usr/local/ffmpeg/bin/ffmpeg -re -i rtsp://admin:qwe*123456@192.168.1.11 -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 - f flv rtsp://192.168.1.47/live/test10 #####
参数配置错误,修改config.ini文件 ffmpeg_cmd模板 将-flv 修改为-f rtsp就可以了
经过验证、这个只能满足使用ffmpeg命令拉流的接口,不满足算法需求
文档说明如下:
GET添加FFmpeg拉流代理(addFFmpegSource)
Open Request
zlmediakit.com:8880/index/api/addFFmpegSource?secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&src_url=http://hefeng.live.tempsource.cjyun.org/videotmp/s10100-hftv.m3u8&dst_url=rtmp://127.0.0.1/live/hks2&timeout_ms=10000&enable_hls=0&enable_mp4=0
Add request description…
Query Params
secret
035c73f7-bb6b-4889-a715-d9eb2d1925cc
api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数
src_url
http://hefeng.live.tempsource.cjyun.org/videotmp/s10100-hftv.m3u8
FFmpeg拉流地址,支持任意协议或格式(只要FFmpeg支持即可)
dst_url
rtmp://127.0.0.1/live/hks2
FFmpeg rtmp推流地址,一般都是推给自己,例如rtmp://127.0.0.1/live/stream_form_ffmpeg
timeout_ms
10000
FFmpeg推流成功超时时间,单位毫秒
enable_hls
0
是否开启hls录制
enable_mp4
0
是否开启mp4录制
ffmpeg_cmd_key
ffmpeg.cmd_hd
FFmpeg命名参数模板,置空则采用配置项:ffmpeg.cmd
更多推荐
所有评论(0)