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

标签 linux video 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:color=black@0.75:t=fill","drawtext=fontsize=30:fontcolor=white@.8: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

最佳答案

我想出了一个可行的解决方案,但这并不是我想要的。理想情况下,文本会在屏幕上滚动、更新,然后开始新的传递。为了避免每次天气更新时文本跳来跳去,我决定使用 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:color=black@0.75: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"

关于linux - 仅在屏幕外重新加载 ffmpeg 中的滚动绘图文本过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65541251/

相关文章:

c - 在 GNU/Linux 上链接插件时如何巧妙地检测 undefined symbol ?

iPad + HTML5 视频标签 + 外部显示问题

actionscript-3 - as3视频全屏模式

python - 检测视频文件中的人脸

linux - 使用bash脚本计算圆的面积和半径

linux - 在 Red Hat Linux Apache Server 脚本中识别错误并查找变量的值

linux - Raspberry Pi 3 v1.2 存在 RTC 同步问题

ios - 使用avplayer时如何提高seek的性能

video - 将多个 ffmpeg 命令合二为一

android - 如何在 Android 上不使用 ffmpeg 修剪视频?