我的头撞在这面墙上已经很长时间了。希望你们都能帮我过去。
我有一个从IP摄像头到我的电脑的实时流。
Nginx发布到YouTube和一个FFmpeg流,该流每分钟都需要一个帧才能用于静态的摄像头图像。
下面是我尝试使用的exec_push代码,但没有成功。YouTube流和帧捕获工作得很好。我已经安装了免费的FFmpeg。这都是在MacOS X 10.15.4Catalina上安装的,安装了家用FFmpeg头。
更新:我还应该说,我尝试过使用命令行FFmpeg输出覆盖,这个命令运行得很好:
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2" /Users/user/Desktop/test.mp4因此,输出部分似乎是FFmpeg不喜欢的部分,在Nginx.conf中
我的想法是,我应该将覆盖的FFmpeg流传递给"overlay“应用程序,并将该流发布到Youtube,并从那里获取框架。(也有可能被记录)。
Update:当我尝试指向sh文件来运行命令而不是直接的FFmpeg exec_push时,我会得到:
[alert] 56849#0: kevent() error on 15 filter:-1 flags:4002 (2: No such file or directory)非常感谢!
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=20: box=1: boxcolor=black@1: boxborderw=75: x=70: y=925" -c:v libx264 -maxrate 6000k -bufsize 4000k -c:a aac -b:a 160k -ar 44100 -b:a 128k -f mp4 rtmp://localhost:1935/overlay/test;
#push rtmp://localhost:1935/overlay;
}
application overlay {
live on;
record off;
push rtmp://a.rtmp.youtube.com app=live2 playpath=yourstreamkey;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg;
}
}
}发布于 2020-04-26 06:43:39
答案是:
( a)我必须通过文件调用Ffmpeg命令,这样才能工作。我不完全确定为什么,但这就是它的方式。
( b)我以前无法从Ffmpeg获得日志信息。是因为我去错地方了。我需要登录到/tmp/,因为Nginx使用的是非特权(无人)用户。合乎道理。
( c)当命令从文件中运行时,我可以看到Ffmpeg抛出的实际错误,并可以对它们进行故障排除。这与选项放置、间距以及确保它是一个flv容器,而不是mp4容器有很大关系。
下面是我最后得到的Nginx rtmp配置:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
meta copy;
exec /Users/Shared/ffmpegcommand.sh $name;
}
application overlay {
live on;
record off;
meta copy;
push rtmp://a.rtmp.youtube.com app=live2 playpath=stream-key;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg;
}
}
}下面是我在用于文本覆盖的命令文件中使用的Ffmpeg命令(现在使用-filter_complex,因为在本例中,-vf不是正确的选项)。
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -filter_complex drawtext="fontfile=/System/Library/Fonts/Supplemental/Verdana.ttf: textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=17: box=1: boxcolor=black@1: boxborderw=80: x=80: y=935" -c:v libx264 -level 4.1 -maxrate 6000k -bufsize 4000k -c:a copy -f flv rtmp://localhost:1935/overlay/newlive 2>>/tmp/ffmpeg.error我还修改了音频选项,使它们直接从源复制,因为不需要编码。
最后,我从我已经拥有的文本文件中创建了覆盖文本文件。现有的覆盖层有一个表示湿度的%符号,所以我不得不在bash脚本中使用sed来转义这个字符。
escovlfiletmp='/Users/Shared/overlayescapedtmp.txt'
escovlfile='/Users/Shared/overlayescaped.txt'
overlaysearch="% B:"
overlayreplace="\\\\\\% B:"
sed -e "s/${overlaysearch}/${overlayreplace}/g" ${overlayfile} > ${escovlfile}我已经附上了最后的视频流结果的屏幕盖。整个黑色区域是覆盖层。
非常开心。
感谢您在这个网站和其他地方提供的所有资源。我花了4天和许多小时不断地寻找,但设法把所有的东西拼凑在一起。
https://stackoverflow.com/questions/61413193
复制相似问题