mpv ipc

以下內容本來要回覆這篇「mpv播放影片控制時間問題請教」,

不過因為我目前登入前可以看到文章列表,登入後無法看到文章列表,

所以也就無法回覆,也無法回文,只剩登出的功能。

因此先紀錄在這,以防時間久了,我又忘記回文這件事了。

:-)

================================================================================

剛剛在觀看「smplayer」的原始碼

然後執行下面指令,來對照著看

================================================================================

先開啟一個「Terminal」,執行下面指令,使用「smplayer」來播放「~/Videos/test.mp4」。

$ smplayer ~/Videos/test.mp4

接著在另一個「Terminal」執行下面指令

$ ps aux | grep mpv

顯示

user      13273 63.0  1.4 1885268 121832 pts/2  Sl+  09:30   0:13 /usr/bin/mpv --no-config --no-quiet --terminal --no-msg-color <span style="color:red;">--input-file</span>=<span style="color:blue;">/dev/stdin</span> --no-fs --hwdec=no --sub-auto=fuzzy --no-input-default-bindings --input-vo-keyboard=no --no-input-cursor --cursor-autohide=no --no-keepaspect --wid=65011731 --monitorpixelaspect=1 --osd-level=1 --osd-scale=1 --osd-bar-align-y=0.6 --sub-ass --embeddedfonts --sub-ass-line-spacing=0 --sub-scale=1 --sub-font=Arial --sub-color=#ffffffff --sub-shadow-color=#ff000000 --sub-border-color=#ff000000 --sub-border-size=0.75 --sub-shadow-offset=2.5 --sub-font-size=50 --sub-bold=no --sub-italic=no --sub-codepage=ISO-8859-1 --vid=1 --sub-pos=100 --volume=57 --cache=auto --start=82 --screenshot-template=cap_%F_%p_%02n --screenshot-format=jpg --screenshot-directory=/home/user/Pictures/smplayer_screenshots --audio-pitch-correction=yes --volume-max=110 --term-playing-msg=MPV_VERSION=${=mpv-version:} INFO_VIDEO_WIDTH=${=width} INFO_VIDEO_HEIGHT=${=height} INFO_VIDEO_ASPECT=${=video-aspect} INFO_VIDEO_FPS=${=container-fps:${=fps}} INFO_VIDEO_FORMAT=${=video-format} INFO_VIDEO_CODEC=${=video-codec} INFO_AUDIO_FORMAT=${=audio-codec-name} INFO_AUDIO_CODEC=${=audio-codec} INFO_AUDIO_RATE=${=audio-params/samplerate} INFO_AUDIO_NCH=${=audio-params/channel-count} INFO_LENGTH=${=duration:${=length}} INFO_DEMUXER=${=current-demuxer:${=demuxer}} INFO_SEEKABLE=${=seekable} INFO_TITLES=${=disc-titles} INFO_CHAPTERS=${=chapters} INFO_TRACKS_COUNT=${=track-list/count} METADATA_TITLE=${metadata/by-key/title:} METADATA_ARTIST=${metadata/by-key/artist:} METADATA_ALBUM=${metadata/by-key/album:} METADATA_GENRE=${metadata/by-key/genre:} METADATA_DATE=${metadata/by-key/date:} METADATA_TRACK=${metadata/by-key/track:} METADATA_COPYRIGHT=${metadata/by-key/copyright:} INFO_MEDIA_TITLE=${=media-title:} INFO_STREAM_PATH=${stream-path}  --audio-client-name=SMPlayer --term-status-msg=STATUS: ${=time-pos} / ${=duration:${=length:0}} P: ${=pause} B: ${=paused-for-cache} I: ${=core-idle} VB: ${=video-bitrate:0} AB: ${=audio-bitrate:0} /home/user/Videos/test.mp4

上面這段,我之前有在「#1 關於「m3u」和「mpv」和「smplayer」的操作使用」有提到過。

================================================================================

接著在上面發現一個參數「–input-file=/dev/stdin」,引起我的注意

一開始先執行「$ man mpv」,使用「–input-file」當關鍵字,找到下面的敘述。


--input-file=<filename>
	   Read commands from the given file. Mostly useful with a FIFO. Since mpv 0.7.0  also
	   understands  JSON commands (see JSON IPC), but you can't get replies or events. Use
	   --input-ipc-server for something bi-directional. On MS Windows, JSON  commands  are
	   not available.

	   This  can  also  specify a direct file descriptor with fd://N (UNIX only).  In this
	   case, JSON replies will be written if the FD is writable.

	   NOTE:
		  When the given file is a FIFO mpv opens both ends, so you can  do  several  echo
		  "seek 10" > mp_pipe and the pipe will stay valid.

================================================================================

接著在網路上找相關文章,使用「mpv –input-file」當關鍵字查詢,找到一篇「參考文章」。

================================================================================

方式一

先開啟一個「Terminal」,執行下面指令

mkfifo /tmp/mpv-fifo

mpv --input-file=/tmp/mpv-fifo --idle

接著開啟另一個「Terminal」,執行下面指令

echo 'loadfile https://www.youtube.com/watch?v=Lqe3MuCyh9o' > /tmp/mpv-fifo

稍等一下,就會看到「mpv」播放「影片」。

接著回到樓主原本提的需求,執行下面指令

echo 'seek 00:01:00 absolute' > /tmp/mpv-fifo

就可以下指令,控制「mpv」從「00:01:00」開始播放影片。

相關參考連結

================================================================================

方式二

先執行下面指令,安裝「socat

$ sudo apt-get install socat

先開啟一個「Terminal」,執行下面指令

mpv --input-ipc-server=/tmp/mpv-pipe --idle

接著開啟另一個「Terminal」,執行下面指令

echo '{"command": ["loadfile", "https://www.youtube.com/watch?v=Lqe3MuCyh9o"]}' | socat - /tmp/mpv-pipe

會收到

{"data":null,"error":"success"}

稍等一下,就會看到「mpv」播放「影片」。

接著回到樓主原本提的需求,執行下面指令

echo '{"command": ["seek", "00:01:00", "absolute"]}' | socat - /tmp/mpv-pipe

就可以下指令,控制「mpv」從「00:01:00」開始播放影片。

相關參考連結

================================================================================

執行

mpv --input-cmdlist

顯示


ignore
seek                 Time [Flags] [Choice]
revert-seek          [Flags]
quit                 [Integer]
quit-watch-later     [Integer]
stop
frame-step
frame-back-step
playlist-next        [Choice]
playlist-prev        [Choice]
playlist-shuffle
sub-step             Integer
sub-seek             Integer
print-text           String
show-text            String [Integer] [Integer]
expand-text          String
show-progress
sub-add              String [Choice] [String] [String]
sub-remove           [Integer]
sub-reload           [Integer]
tv-last-channel
screenshot           [Flags] [Choice]
screenshot-to-file   String [Choice]
screenshot-raw       [Choice]
loadfile             String [Choice] Key/value list
loadlist             String [Choice]
playlist-clear
playlist-remove      Choice
playlist-move        Integer Integer
run                  String String
set                  String String
add                  String [Double]
cycle                String [up|down]
multiply             String Double
cycle-values         String String String
enable-section       String [Flags]
disable-section      String
define-section       String String [Choice]
ab-loop
drop-buffers
af                   String String
af-command           String String String
ao-reload
vf                   String String
vf-command           String String String
script-binding       String
script-message       String
script-message-to    String String
overlay-add          Integer Integer Integer String Integer String Integer Integer Integer
overlay-remove       Integer
write-watch-later-co
hook-add             String Integer Integer
hook-ack             String
mouse                Integer Integer [Integer] [Choice]
keypress             String
keydown              String
keyup                [String]
audio-add            String [Choice] [String] [String]
audio-remove         [Integer]
audio-reload         [Integer]
rescan-external-file [Choice]
apply-profile        String
load-script          String


================================================================================

執行

mpv -h

或是

mpv --help

顯示

Usage:   mpv [options] [url|path/]filename

Basic options:
 --start=<time>    seek to given (percent, seconds, or hh:mm:ss) position
 --no-audio        do not play sound
 --no-video        do not play video
 --fs              fullscreen playback
 --sub-file=<file> specify subtitle file to use
 --playlist=<file> specify playlist file

 --list-options    list all mpv options
 --h=<string>      print options which contain the given string in their name

================================================================================

其他範例如下

執行

mpv --list-options

執行

mpv --h=input-file

執行

mpv --h=input-ipc-server

執行

mpv --h=idle

執行

mpv --h=list

執行

mpv --list-properties

執行

mpv --list-protocols

執行

mpv --list-protocols

執行

mpv --input-cmdlist

執行

mpv --input-keylist

執行

mpv --h=cache

執行

$ mpv --cache-secs=600 'https://www.youtube.com/watch?v=Lqe3MuCyh9o'

================================================================================

上面「方式一」,可以簡化成下面步驟

先開啟一個「Terminal」,執行下面指令

mkfifo /tmp/mpv-fifo

mpv --input-file=/tmp/mpv-fifo --cache-secs=600 'https://www.youtube.com/watch?v=Lqe3MuCyh9o'

接著執行下面指令

echo 'seek 00:01:00 absolute' > /tmp/mpv-fifo

就可以下指令,控制「mpv」從「00:01:00」開始播放影片。

================================================================================

以上提供參考,

報告完畢

:-)