에는 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
mpvplay.sh
다음은 임의의 위치에서 첫 번째 제목을 찾고 위의 명령을 포함하는 작은 bash 스크립트입니다 . 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초부터 시작됩니다.