簡體   English   中英

問:Bash腳本無限循環導致ffmpeg垃圾郵件

[英]Q: Bash script infinite loop causing ffmpeg spam

似乎無法弄清楚這一點...我已經設置了具有出色RTMP擴展的NGINX服務器,並且一切正常。 但是,我試圖重播/推送需要在另一個RTMP流應用程序中流傳輸的幾個特定流的副本(具體來說,這些流被流傳輸到應用程序“靜態”,但在當前情況下也需要推送)為了活着”)。 在NGINX-RTMP中重播/推送流的過程相對簡單,但是,在我的情況下,我需要選擇性地推送幾個流,而不是將每個流都流傳輸到應用程序“靜態”。

想法是讓NGINX-RTMP將流名稱傳遞給bash腳本,然后bash腳本進行重新流傳輸而不會中斷任何其他流或服務。

通過一些成功,我嘗試通過創建bash腳本來做到這一點。

運行bash腳本的相關NGINX配置位為:

exec_publish /etc/nginx/rtmp_conf.d/stream_id.sh $name;

我嘗試了一個“如果/否則”

if [ $1 == "stream_name_1" ]; then
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_1 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_0
elif [ $1 == "stream_name_2" ]; then
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_2 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_1
elif [ $1 == "stream_name_3" ]; then
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_3 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2
elif [ $1 == "stream_name_4" ]; then
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_4 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3
else
        echo "FAIL" >> /etc/nginx/rtmp_conf.d/stream.log && echo date > /etc/nginx/rtmp_conf.d/stream.log
        exit
fi

我嘗試過開關

case "$1" in
        "stream_name_1")
            ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_1 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_0
        ;;
        "stream_name_2")
            ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_2 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_1
        ;;
        "stream_name_3")
            ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_3 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2
        ;;
        "stream_name_4")
            ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_4 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3
        ;;
        echo "FAIL " >> /etc/nginx/rtmp_conf.d/stream.log && echo date > /etc/nginx/rtmp_conf.d/stream.log
esac

兩者的問題在於,它們最終都導致大量的ffmpeg進程被垃圾郵件...而且我不知道為什么-我試圖更改代碼,但最終要么是ffmpeg根本不觸發,要么是向服務器發送垃圾郵件。

需要更多信息。
ffmpegs說什么?
您檢查過$ 1嗎?
我想看整個腳本。

事實證明,在我的情況下,ffmpeg不喜歡參數標志“ -vcodec x264”(這很奇怪,因為源流是用x264編碼的,但是很好),將其更改為使用“復制”音頻和視頻編解碼器解決了我的問題-ffmpeg不再產生數十個進程,每個進程都試圖使用異常的資源量。

在我的情況下,工作代碼的示例為:

為了啟動bash腳本,我將其放置在我的NGINX配置中(根據RTMP模塊的設計,它將傳入的流名稱傳遞給bash腳本):

 exec_publish /etc/nginx/rtmp_conf.d/stream_id.sh $name;

使用開關:

#!/bin/bash
case "$1" in
    "stream_name_1")
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_0
    ;;
    "stream_name_2")
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_2 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_1
    ;;
    "stream_name_3")
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_3 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2
    ;;
    "stream_name_4")
        ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_4 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3
    ;;
esac

並使用If / Else:

#!/bin/bash
if [ $1 == "stream_name_1" ]; then
    ffmpeg -re -i rtmp://127.0.0.1:2000/static/$1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_0
elif [ $1 == "stream_name_2" ]; then
    ffmpeg -re -i rtmp://127.0.0.1:2000/static/$1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_1
elif [ $1 == "stream_name_3" ]; then
    ffmpeg -re -i rtmp://127.0.0.1:2000/static/$1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2
else [ $1 == "stream_name_4" ]; then
    ffmpeg -re -i rtmp://127.0.0.1:2000/static/$1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3
fi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM