在 mpv 中,如何在播放列表的随机时刻开始播放?

在 mpv 中,如何在播放列表的随机时刻开始播放?

在 中mpv,有--start开关,它允许我提供跳过的秒数。这样我就可以在单个文件中随机开始播放。

还有--shuffle这允许我开始播放给定播放列表中的随机文件。

我将两者结合起来:

  1. 选择一个随机文件并
  2. 在该文件中的随机时刻开始播放

使用此命令行:

mpv --shuffle --start $POSITION --playlist=/tmp/list.m3u

问题

但是,--start列表中后面的每个文件也会考虑该参数,并且这些文件的前 X 秒也将被跳过。我不想那样。

我尝试过的

目前我mpv按顺序调用两次,但这很丑陋。

问题

有没有办法--start只影响播放的第一个文件?

或者,更好的是,在随机播放列表中完全随机的时刻获取 mpv。因此,如果列表为 123 分钟,则它将从 31 分 13 秒开始,无论它在文件中的位置有多远。

答案1

使用套接字,您可以在后台以暂停状态启动播放器:

# with playlist
mpv --shuffle --pause --input-ipc-server=/tmp/mpvsocket test.m3u &

# without playlist, load a playlist
mpv --shuffle --pause --idle=yes --input-ipc-server=/tmp/mpvsocket &
echo '{ "command": [ "loadfile", "test.m3u" ] }' | socat - /tmp/mpvsocket

然后查找当前标题的开始位置(如果大于长度则跳转到下一个标题的开始位置)

# seek 100s forward (relative)
echo '{ "command": [ "seek", "+100" ] }' | socat - /tmp/mpvsocket

# seek to 1:30 (absolute)
echo '{ "command": [ "seek", "1:30", "absolute" ] }' | socat - /tmp/mpvsocket

并取消暂停播放器

echo '{ "command": [ "set_property", "pause", false ] }' | socat - /tmp/mpvsocket

这是一个小 bash 脚本mpvplay.sh,用于查找第一个标题的随机位置并包含上述命令。您需要socatjq并且shuf

# start player in background
mpv --shuffle --pause --input-ipc-server=/tmp/mpvsocket "$@" &

# wait until socket exists
while [ ! -S /tmp/mpvsocket ]; do :; done

sleep 0.5 # hack: wait a little longer

# get duration of current title in seconds with fractional part, save as integer
duration=$(echo '{ "command": ["get_property", "duration"] }' | socat - /tmp/mpvsocket |
    jq -r '.data | floor')
echo "title duration: $duration"

# get random start position of title
duration=$(shuf -n1 -i0-"$duration")
echo "random seek: $duration"

# seek to position
echo '{ "command": [ "seek", "+'"$duration"'" ] }' | socat - /tmp/mpvsocket

# unpause player
echo '{ "command": [ "set_property", "pause", false ] }' | socat - /tmp/mpvsocket

# player to foreground
fg

使用您的播放列表作为参数来获取脚本:

. ./mpvplay.sh playlist.m3u

答案2

在播放列表文件中使用 M3U 指令进行时间偏移

假设您的播放列表位于M3U格式并包含多个音频文件,例如M3U实施例1在维基百科上:

#EXTM3U
 
#EXTINF:123, Sample artist - Sample title
C:\Documents and Settings\I\My Music\Sample.mp3
 
#EXTINF:321,Example Artist - Example title
C:\Documents and Settings\I\My Music\Greatest Hits\Example.ogg

然后,您可以添加开始偏移,为播放列表应用一次(不是每个文件),方法是添加扩展M3U指令用于时间偏移#EXT-X-START: TIME-OFFSET=0, 在哪里

TIME-OFFSET 的值是有符号十进制浮点数的秒数。

将时间偏移插入播放列表

要在第 2 行插入带有给定环境变量的偏移指令$POSITION,您可以使用sed在命令行上:

sed "2 i #EXT-X-START: TIME-OFFSET=$POSITION" /tmp/list.m3u

这会导致修改后的播放列表应用了您的自定义时间偏移位置,例如时间偏移1873秒数:

#EXTM3U
#EXT-X-START: TIME-OFFSET=1873

#EXTINF:123, Sample artist - Sample title
C:\Documents and Settings\I\My Music\Sample.mp3
 
#EXTINF:321,Example Artist - Example title
C:\Documents and Settings\I\My Music\Greatest Hits\Example.ogg

当使用音频播放器启动播放列表时,例如多用途车这应该直接跳转到您想要的偏移1873秒数:

因此,如果列表为 123 分钟,则将从 31 分 13 秒开始

相关内容