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

Logo

更多推荐