为什么进程替换不适用于 VLC 播放列表?

为什么进程替换不适用于 VLC 播放列表?

符合我的预期

  • cat <(shuf my_ordered_playlist.m3u)
  • echo <(shuf my_ordered_playlist.m3u)
  • vlc my_ordered_playlist.m3u

没有达到我的预期

  • vlc <(shuf my_ordered_playlist.m3u)

我想做的事

  • 每次调用 vlc 时,以非确定顺序播放播放列表中的元素,并且
  • 按下后退按钮即可后退(--random提供的支持较差)。

其他说明

  • 我可以通过此处的文档实现我想要做的事情吗<<<

答案1

另一种选择是分两个阶段进行,并将已随机播放的播放列表通过文件而不是命令行传递给 VLC。

shuf my_ordered_playlist.m3u > /tmp/random_playlist.m3u && vlc /tmp/random_playlist.m3u

你甚至可以将其扩展到

shuf my_ordered_playlist.m3u > /tmp/random_playlist.m3u && vlc /tmp/random_playlist.m3u && rm /tmp/random_playlist.m3u 

VLC 退出后进行清理。

你甚至可以使用bash 别名

alias shuf_vlc="shuf my_ordered_playlist.m3u > /tmp/random_playlist.m3u && vlc /tmp/random_playlist.m3u && rm /tmp/random_playlist.m3u"

然后就可以shuf_vlc随机播放您的播放列表。


你的命令不起作用的原因是仍然管道并受到管道的限制。

流程替代的局限性

进程替换有一些限制:

  • 沒有文件尋找:创建的“文件”不可寻址,这意味着读取或写入文件的进程不能执行随机访问;它必须从头到尾读取或写入一次。在打开文件之前明确检查文件类型的程序可能会拒绝使用进程替换,因为进程替换产生的“文件”不是常规文件。

  • 没有退出代码:“无法从创建进程替换的 shell 中获取进程替换命令的退出代码。”

根据您所看到的行为,VLC 可能正在尝试检查有效的播放列表(以检查 UTF-8/16 等或文件是否正确构建),但实际上并非如此阅读第一次传递时,它会尝试返回以实际加载文件,但由于“无文件搜索”,因此无法读取播放列表。第一次传递实际上清空了被赋予文件描述符的管道,然后就没有任何可用的东西了。

或者,VLC 检查该文件是否“真实”并且可以被seek阅读,如果发现不能阅读,那么它就会拒绝打开它,因为它无法正向和反向解析该文件。

你的前两个命令很简单,只需要一个可读的流,VLC 想要一些真实的它可以坚持下去。

答案2

为什么进程替换不适用于 VLC 播放列表?

因为vlc 在这件事上设计得很差。更糟糕的是,设计得很差两次
可能有其原因*以产生以下两个缺点的方式工作:

  • inotifywait -m my_ordered_playlist.m3u表明vlc my_ordered_playlist.m3u文件被打开并读取多次。我还没有调查是否涉及寻道。当您使用<(shuf my_ordered_playlist.m3u) vlc获取管道数据时shuf,它只能读取一次。显然这还不够。在理想情况下,vlc只读取一次数据就足够了。

  • vlc拒绝使用没有扩展名的播放列表。在 Zsh 中,=()语法类似于<();不同之处在于 shell 会创建一个临时的常规文件而不是管道。这样的文件可以多次读取,并且可以查找。这似乎是解决您问题的好办法(如果您对 Zsh 没问题),但通常文件名没有扩展名,所以vlc =(shuf my_ordered_playlist.m3u)仍然不起作用。

    有办法

    # in zsh
    TMPSUFFIX=.m3u; vlc =(shuf my_ordered_playlist.m3u)
    

    如果您希望更改TMPSUFFIX不影响主 shell,请在子 shell 中运行命令。


vlc*“设计不佳”这一说法得到了一条有用的评论:

我怀疑文件中至少有一个搜索是确定文件是 ANSI、UTF-8 还是 UTF-16(带或不带字节顺序标记),然后使用内部应用的适当格式重新扫描文件。当然,这并不能阻止 VLC 需要扩展名,而扩展名不是当您考虑到 VLC 可能看到的格式数量时,这很愚蠢……您真的不能指望它先扫描文件,然后将其与每个内部解码器进行摩擦以查看哪一个有效,其操作会在第一次搜索后清空管道并使数据再次无用……

相关内容