背景
- 我有一个运行nginx-rtmp模块的docker容器
- 在这个容器上我接收到一个rtmp流,它被记录下来,转换成hls并显示在一个html页面上
- 通过hls的流式传输和显示工作正常
目标
我的目标是录制大约一个小时(或一定的文件大小),然后保存录音,转换为mp4,推到一个对象存储桶,然后删除旧文件。(然后录制下一个小时等等)
当前实现
我通过编写一个shell脚本实现了这一点,该脚本通过nginx-rtmp模块的exec_record_done函数执行
我的nginx.conf:
...
# RTMP configuration
rtmp {
server {
...
application live {
live on;
recorder all {
record all;
record_path /var/www/html/stream/mp4;
record_max_size 100000K;
record_unique on;
record_suffix _%d%m%Y_%H%M.flv;
exec_record_done /bin/bash /scripts/cleaner.sh $path $dirname $basename;
}
...
}
}
}
http {
...
}
我的剧本:
#!/bin/bash
path=$1
dirname=$2
basename=$3
newfile="${dirname}/${basename}.mp4"
ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 $newfile &&
rm $path
TIME=$(/bin/date +%Y/%m/%d)&&
rclone sync -P $newfile objstor:bucket/$TIME/ &&
rm $newfile
问题
当我手动运行脚本时,整个事情都按预期工作。但是当通过exec_record_done运行时,当达到录制的文件大小时(按预期),脚本生成mp4文件,删除flv(按预期),但不会推送到对象存储。
我很难理解为什么当我手动运行脚本时它可以工作,但当通过exec_record_done运行时却不行。
2条答案
按热度按时间cwxwcias1#
我会在脚本中添加日志记录来查找问题。例如,您的某个参数可能为空,或者您的
ffmpeg
出现了其他问题。qvk1mo1f2#
感谢Yaser Kalali的回答,我发现rclone找不到rclone. conf。使用--config=选项,我告诉它在哪里可以找到conf文件。现在一切正常!