在 中mpv
,有--start
开关,它允许我提供跳过的秒数。这样我就可以在单个文件中随机开始播放。
还有--shuffle
这允许我开始播放给定播放列表中的随机文件。
我将两者结合起来:
- 选择一个随机文件并
- 在该文件中的随机时刻开始播放
使用此命令行:
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
,用于查找第一个标题的随机位置并包含上述命令。您需要socat
,jq
并且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 秒开始