首页 > 解决方案 > 流式传输时更改 ffmpeg 输入

问题描述

有没有办法在流式传输到 rtmp 时更改 ffmpeg 输入?我有这个 bash 脚本

 #! /bin/bash

VBR="1500k"
FPS="24"
QUAL="superfast"

RTMP_URL="rtmp://live.live/live"
KEY="xxxxxxxxxxxxxxxxxxxxx"
VIDEO_SOURCE="video.mp4"
AUDIO_SOURCE="song.mp3"
NP_SOURCE="song.txt"
FONT="font.ttf"

ffmpeg \
    -re -f lavfi -i "movie=filename=$VIDEO_SOURCE:loop=0, setpts=N/(FRAME_RATE*TB)" \
    -thread_queue_size 512 -i "$AUDIO_SOURCE" \
    -map 0:v:0 -map 1:a:0 \
    -map_metadata:g 1:g \
    -vf drawtext="fontsize=25: fontfile=$FONT: \
        box=1: boxcolor=black@0.5: boxborderw=20: \
        textfile=$NP_SOURCE: reload=1: fontcolor=white@0.8: x=50: y=50" \
    -vcodec libx264 -pix_fmt yuv420p -preset $QUAL -r $FPS -g $(($FPS * 2)) -b:v $VBR \
    -acodec libmp3lame -ar 44100 -threads 6 -qscale:v 3 -b:a 320000 -bufsize 512k \
    -f flv "$RTMP_URL/$KEY"

我想要做的是能够即时更改 VIDEO_SOURCE,我在想是否可以将输入设为目录然后动态更改该目录中的视频,我是处理脚本的新手,所以我不不知道该怎么做

标签: bash

解决方案


这是一个完整的猜测,基于我对如何ffmpeg处理交互式输入知之甚少:

while :; do

    ffmpeg \
        -re -f lavfi -i "movie=filename=$VIDEO_SOURCE:loop=0, setpts=N/(FRAME_RATE*TB)" \
        -thread_queue_size 512 -i "$AUDIO_SOURCE" \
        -map 0:v:0 -map 1:a:0 \
        -map_metadata:g 1:g \
        -vf drawtext="fontsize=25: fontfile=$FONT: \
            box=1: boxcolor=black@0.5: boxborderw=20: \
            textfile=$NP_SOURCE: reload=1: fontcolor=white@0.8: x=50: y=50" \
        -vcodec libx264 -pix_fmt yuv420p -preset $QUAL -r $FPS -g $(($FPS * 2)) -b:v $VBR \
        -acodec libmp3lame -ar 44100 -threads 6 -qscale:v 3 -b:a 320000 -bufsize 512k \
        -f flv "$RTMP_URL/$KEY"

    read -p "Next movie?" VIDEO_SOURCE
    [ "$VIDEO_SOURCE" = q ] && break
done

ffmpeg如果您发送q到标准输入,应该(?)退出。然后,您的脚本将提示您为VIDEO_SOURCE. 如果q再次键入,则循环退出。否则,它将ffmpeg使用新的视频源文件重新启动。

如果这可行,您也许可以对其进行调整以适应更接近您的需求。


推荐阅读