mpvでプレイリストのランダムな瞬間に再生を開始するには?

mpvでプレイリストのランダムな瞬間に再生を開始するには?

mpvあります--startスキップ時間(秒)を提供できるスイッチです。これにより、単一のファイル内でランダムに再生を開始できます。

しかも--shuffleこれにより、指定されたプレイリストからランダムなファイルの再生を開始できます。

私は2つを組み合わせます:

  1. 任意のファイルを選択して
  2. ファイル内の任意の瞬間に再生を開始

次のコマンドラインを使用してください。

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

質問

ただし、--startリストの後半にある各ファイルもこのパラメータを考慮し、そのファイルの最初のX秒もスキップします。私はそれをしたくありません。

私が試したこと

現在、私はmpvそれを順番に2回呼び出していますが、これは醜いです。

質問

--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

mpvplay.sh以下は、任意の場所で最初のタイトルを探し、上記のコマンドを含む小さなbashスクリプトです。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の値は、符号付き10進浮動小数点数の秒数です。

プレイリストに時間オフセットを挿入する

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秒から始まります。

関連情報