我想使用Liquidsoap创建一个音频-视频流。并在视频中显示当前曲目的进度和总时间。我想知道实现这一目标的最佳实践是什么。我目前使用以下方法,其中:
- 通过
source.remaining
功能获取当前进度。 - 总长度是一个全局变量
track_length
,在on_track
回调中被修改。
但是,当前的方法存在以下问题:
source.remaining
的返回值不会以恒定的速度变化,就像文档中所说的"估计剩余时间"一样。在可以19min,然后突然跳到19分20秒,然后跳到18分50秒。但是,随着剩余时间越来越少,估计变得更加准确。track_length
变量在当前轨道开始后确实会被修改。但是,获取变量的文本绘图函数始终获取初始值,并且永远不会更改。
感谢您的帮助!
这是我脚本的相关部分:
# Define the global variable to store the length of current track
track_length = 0
# Define the on_track callback which updates track_length
def process_metadata(metadata)
file_name = metadata["filename"]
track_length = file.duration(file_name)
end
# Define the audio source and hook on_track callback
audio = fallback([sequence([
single("/etc/liquidsoap/lssj1.mp3")
])])
audio = on_track(process_metadata, audio)
# Define the function which returns the text to render
def get_time()
"$(cur)/$(total)" % [("cur", string_of(source.remaining(audio))), ("total", string_of(track_length))]
end
# Create the video frame
video = fallback([blank()])
video = video.add_text.sdl(x=0, y=300, size=40, get_time, video)
液体肥皂中没有这样的术语"全局变量">
没有赋值,只有定义。 x = expr 不会修改 x,它只是定义一个新的 x。表达式 (x = s1 ; def y = x = s2 ;(x,s3( 结束 ;(y,x((计算结果为 ((s2,s3(,s1(。
链接: https://www.liquidsoap.info/doc-dev/language.html
因此,您应该使用引用:
定义:
track_length = ref 0
然后修改它(注意我们也使用 int_of_float(:
track_length := int_of_float(file.duration(file_name))
然后获取其值:
!track_length
我相信它会解决你的问题