我尝试每隔 x 秒覆盖一次图像广告,方法是淡入淡出。这是我们位于丹麦南部的公司的直播。应该说我使用 FFMPEG 才 3 天。它在 Ubuntu Server 22.04 上运行,也就是说 ffmpeg 4.4.2。我希望有人愿意帮助我。:)))
当我运行脚本时,我得到了视频源,但水印消失了,并且没有图片广告淡入。我想要发生的是,水印和文本横幅显示在视频源的顶部,并且每隔 x 秒,图片广告就会淡入并覆盖所有内容 x 秒,然后消失 - 永远重复。
还有一些 DTS 错误,但没有中断流?说实话,不确定是什么。
我遇到了很多麻烦,所以如果有必要就拍摄!
我在一位中高级 Linux 用户的帮助下构建了这个,但他对 ffmpeg 一无所知。我开始了解 FFMPEG。我大约才 1/2 岁才接触 Linux :)))
有些词是丹麦语,例如 tilbudstekst.txt - 意思是 Offerstext.txt。
这是我的脚本:
#!/bin/bash
path=$(readlink -f "${0%/*}")
cd "$path"
echo "moved to the script folder $path"
# Input settings
input_url="rtsp://*:*@*:*/*"
input_args="-correct_ts_overflow 0 -fflags +discardcorrupt -fflags +genpts -deinterlace -color_range pc"
# Output settings
YOUTUBE_URL="rtmp://a.rtmp.youtube.com/live2" # RTMP-URL fra youtube
BACKUP_URL="rtmp://b.rtmp.youtube.com/live2?backup=1" # BACKUP RTMP-URL fra youtube
KEY="****-****-****-****-****" # Streamkey fra YT
VBR="2500k" # Bitrate
FPS="30" # FPS
QUAL="medium" # Preset - evt. se FFMPEG
output_args="-vcodec libx264 -pix_fmt yuv420p -preset $QUAL -tune zerolatency -r $FPS -g $(($FPS * 2)) -b:v $VBR -vsync 1 -acodec libmp3lame -ar 44100 -threads 4 -q:a 3 -b:a 712000 -bufsize 512k -af volume=0 -color_range pc"
output_filter="-f tee -map [out] -map 0:a -flags +global_header [f=flv]${YOUTUBE_URL}/${KEY}|[f=flv]${BACKUP_URL}/${KEY}"
# Advertisement settings
ad_duration=9
ad_fade_in=2
ad_fade_out=2
ad_wait_interval=10
ad_interval=$((ad_wait_interval+ad_fade_in+ad_fade_out+ad_duration))
# Watermark settings
watermark_path="./logo.jpg"
watermark_opacity="0.6"
watermark_filter="scale=200:200,format=rgba,colorchannelmixer=aa=$watermark_opacity"
# Text counter + speed settings
filename="tilbudstekst.txt" # Tæller antal tegn, og spytter et tal ind i variablen.
TEGN=$(wc -m < "$filename")
SF="0.3" # Speed Faktor. Jo lavere, jo hurtigere bevæger teksten sig. Den kan bruges til at finjustere hastigheden på bannerteksten.
SPEED="($TEGN*$SF)" # Hvor lang tid den den samlede besked tager at vise
# Text banner settings
text="./tilbudstekst.txt"
text_font_path="/usr/share/fonts/segoeuil.ttf"
text_font_size=120
text_font_color="black"
text_bg_color="white"
text_bg_opacity=0.6
text_bg_height="($text_font_size*1.2)"
text_filter="drawbox=0:(ih-$text_bg_height):iw:$text_bg_height:color=$text_bg_color@$text_bg_opacity:t=h, drawtext=textfile='$text':fontfile=/usr/share/fonts/segoeuil.ttf:x=w-mod(max(t-4.5\,0)*(w+tw)/$SPEED\,(w+tw)):y=(h-line_h-10):fontsize=$text_font_size:fontcolor=$text_font_color@$text_bg_opacity"
# main filter
main_scaler="scale=1920:1080"
# Advertisement filter
ad_scaler="scale=1920:1080"
ad_filter="loop=-1:size=$((ad_interval*FPS)),format=rgba,fade=in:st=0:d=$ad_fade_in:alpha=1,fade=out:st=$ad_duration:d=$ad_fade_out:alpha=1"
#ad_filter="format=rgba,loop=loop=0:size=$((ad_interval*FPS)),setpts=PTS-STARTPTS"
# Combine filters
filter=" \
[1:v]$watermark_filter[water]; \
[2:v]$ad_scaler, $ad_filter[ad]; \
[0:v]$main_scaler, $text_filter[main]; \
[main][water]overlay=20:20[main+water]; \
[main+water][ad]overlay=0:0[out]"
# Rename all files in folder to img%d.jpg (fortløbne numre)
img_dir="./billedeannoncer"
move_jpg(){
i=1
for img in $img_dir/*.jpg; do
mv "$img" "$img_dir/img${i}.jpg"
((i++))
done
}
while sleep 30; do move_jpg; done & while_move=$!
trap 'kill -9 $while_move' EXIT
ffmpeg $input_args -i $input_url -i $watermark_path -framerate 1/5 -i "$img_dir/img%d.jpg" \
-filter_complex "$filter" \
$output_args \
${output_filter}
答案1
它不是一个脚本:
ffmpeg \
-stream_loop -1 -t 300 -i "../all ok propoganda.mp4" \
-loop 1 -i "../logo.png" \
-framerate 4/10 -i "./billedeannoncer/%03d.jpg" \
-filter_complex "
[0:v]scale=1280:720,
drawbox=0:(ih-(120*1.2)):iw:(120*1.2):[email protected]:t=h,
drawtext=textfile='./tilbudstekst.txt'
:fontfile=/usr/share/fonts/segoeuil.ttf
:x=w-mod(max(t-4.5\,0)*(w+tw)/(14*0.3)\,(w+tw))
:y=(h-line_h-10)
:fontsize=120
:[email protected][main];
[1:v]scale=200:200,
format=rgba,
colorchannelmixer=aa=0.6[water];
[2:v]scale=1280:720,
format=rgba,
fps=30,
fade=in:st=0:d=2,
fade=out:st=8:d=2[ad];
color=black@0:s=1280x720:r=30:d=90[blank];
[ad][blank]concat=n=2:v=1:a=0,loop=-1:size=30*100[ad];
[main][water]overlay=20:20:shortest=1[main+water];
[main+water][ad]overlay=0:0:shortest=1[out]
" -map [out] -map 0:a /tmp/out.mp4 -y
不知怎的,它对我有用:)
-framerate 4/10
每 10 秒的广告时长包含 4 张图片
color=bla...:d=90
其中 90 是空白视频的持续时间
loop=-1:size=30*100
其中 30 为 fps,100 为广告+空白的持续时间