【问题标题】:How can I display progress and track length in the video stream of LiquidSoap如何在 LiquidSoap 的视频流中显示进度和曲目长度
【发布时间】:2019-02-14 10:57:05
【问题描述】:

我想使用 Liquidsoap 创建一个音频-视频流。并在视频中显示当前曲目的进度和总时间。我想知道实现这一目标的最佳做法是什么。我目前使用以下方法,其中:

  • 通过source.remaining函数获取当前进度。
  • 总长度为全局变量track_length,在on_track回调中修改。

但是,目前的方法存在以下问题:

  • source.remaining 的返回值不会像文档中提到的“估计剩余时间”中那样以恒定速度变化。 in可以是19min,突然跳到19min20s,再跳到18min50。但是,随着剩余时间越来越少,估计会变得更加准确。
  • 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)

【问题讨论】:

  • 使用 Liquidsoap >= 1.4.0 的人会读到:file.duration 现在称为request.duration

标签: liquidsoap


【解决方案1】:

liquidsoap 中没有“全局变量”这样的术语

没有赋值,只有定义。 x = expr 不修改 x,它只是定义了一个新的 x。表达式 (x = s1 ; def y = x = s2 ; (x,s3) end ; (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

我相信它会解决你的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多