仅在屏幕外时重新加载 ffmpeg 中的滚动绘制文本过滤器

仅在屏幕外时重新加载 ffmpeg 中的滚动绘制文本过滤器

我在 ffmpeg 中有一个 drawtext 过滤器,它在屏幕底部从右向左滚动显示当前天气数据。我遇到的问题是包含天气数据的文本文件每 2 秒更新一次,当天气读数发生变化时,文本的长度也会变化。这会导致循环文本跳动。我尝试使用条件语句将 reload 设置为 1,仅当 x 大于屏幕宽度时,但似乎 reload 不会评估条件语句。有人能想出解决这个问题的方法,让文本在屏幕外时每循环只更新一次吗?

我的命令:

ffmpeg -thread_queue_size 512 -re -rtsp_transport tcp -i "rtsp://192.168.x.x:7447" -i /YouTubeStream/CupolaCam/logo.png -f lavfi -i anullsrc -filter_complex "[0:v][1:v]overlay=20:925","drawbox=x=0:y=ih-35:w=iw:h=35:[email protected]:t=fill","drawtext=fontsize=30:[email protected]:line_spacing=10:fontfile=/usr/share/fonts/truetype/Courier_Prime/CourierPrime-Regular.ttf:textfile=/YouTubeStream/CupolaCam/weatherdata/curtempformatted:y=h-line_h-5:x='if(gt(x\,-tw),w-mod(4*n\,w+tw)\,w)':reload=1" -c:v libx264 -profile:v high -bf 2 -g 15 -crf 18 -pix_fmt yuv420p -c:a aac -profile:a aac_low -b:a 128k -movflags faststart -f flv "rtmp://a.rtmp.youtube.com/live2/stream_key"

YouTube 上的视频:https://www.youtube.com/watch?v=Av6k8bf_2Zc

答案1

我想出了一个可行的解决方案,但它并不完全符合我的预期。理想情况下,文本会在屏幕上滚动,更新,然后开始新的传递。为了避免每次天气更新时文本跳来跳去,我决定使用 ImageMagick 将天气文本转换为固定大小的图像。然后我在 ffmpeg 中叠加图像并使用滚动过滤器滚动它。更新的命令如下。

使用天气数据创建文本文件并转换为固定大小的图像(ImageMagick 转换):

    echo "$humandatecc | Temp: $curtemp°F | Feels Like: $feelslike°F | Dew Point: $dewpntf°F | Humidity: ${curhumid}% | Wind: $suswind mph $suswinddir | Gust: $wndgust | Precip: $accprecip\" | Precip Rate: $rateprecip\"/hour" > /tmp/ccdata.tmp && convert -size 4075x30 xc:transparent -font "Courier-Prime-Regular" -pointsize 30 -fill "rgba(255,255,255,0.90)" -annotate +5+20 @/tmp/ccdata.tmp +repage /tmp/curtempformatted.png && mv /tmp/curtempformatted.png /YouTubeStream/CupolaCam/weatherdata/curtempformatted.png

然后我在 ffmpeg 中叠加图像并使用滚动过滤器在视频底部水平滚动图像。

ffmpeg -thread_queue_size 512 -nostats -loglevel 8 \
        -rtsp_transport tcp -i "rtsp://192.168.x.x:7447/" \
        -f image2 -stream_loop -1 -re -i /YouTubeStream/CupolaCam/logo.png \
        -f image2 -stream_loop -1 -re -i /YouTubeStream/CupolaCam/weatherdata/curtempformatted.png \
        -f lavfi -i anullsrc \
        -filter_complex \
                 "[2]scroll=horizontal=0.0011[i2]; \
                 [0]drawbox=x=0:y=ih-35:w=iw:h=35:[email protected]:t=fill[v]; \
                 [v][1]overlay=20:925[vl]; \
                 [vl][i2]overlay=0:H-30" \
        -c:v libx264 -profile:v high -bf 2 -g 15 -crf 18 -pix_fmt yuvj420p -c:a aac -profile:a aac_low -b:a 128k -movflags faststart \
        -f flv "rtmp://a.rtmp.youtube.com/live2/stream_key"

相关内容