如何連續播放播放列表?
我有一個 20 秒長的影片文件。我把這個影片文件切成段,比如
video_file_0 -> starts at 0:00, ends at 0:02 video_file_1 -> starts at 0:02, ends at 0:04 video_file_2 -> starts at 0:04, ends at 0:06 video_file_3 -> starts at 0:06, ends at 0:08 video_file_4 -> starts at 0:08, ends at 0:10 video_file_5 -> starts at 0:10, ends at 0:12 video_file_6 -> starts at 0:12, ends at 0:14 video_file_7 -> starts at 0:14, ends at 0:16 video_file_8 -> starts at 0:16, ends at 0:18 video_file_9 -> starts at 0:18, ends at 0:20
所以我的問題是,如何在單個視窗中連續播放這些影片文件,就像從 0:00 到 0:20 播放整個影片文件一樣,而無需在每次切換影片文件時關閉和重新打開視窗。我可以使用 ffplay、ffmpeg 或 vlcj 來實現此功能嗎?
我試過了
find -type f -name "video_file_*" | while read f; do ffplay -autoexit -- "$f"; done
但是這段程式碼會關閉並重新打開每個影片文件之間的視窗,我不希望這樣。我怎樣才能做到這一點?
編輯:我正在建構一個 Java 項目,其中的流顯示在 JFrame 中。所以我希望這個功能顯示在 JFrame 中。
如手冊中所述,如何
mpv --gapless-audio=yes --loop-playlist=inf video_file_*
啟用無縫播放:--gapless-audio=<no|yes|weak>
嘗試在文件更改時播放連續的音頻文件,而不會出現靜音或中斷。預設值:弱。
no
:禁用無縫音頻。
yes
:使用為第一個播放的文件選擇的參數打開音頻設備,然後保持打開狀態以進行無縫播放。這意味著,例如,如果第一個文件的採樣率較低,則後續文件可能會被重新採樣到相同的低採樣率,從而導致音質下降。如果您播放具有不同參數的文件,請考慮使用 –audio-samplerate 和 –audio-format 等選項來明確選擇共享輸出格式。
weak
:通常,音頻設備保持打開狀態(使用它最初初始化的格式)。如果解碼器輸出的音頻格式發生變化,音頻設備將關閉並重新打開。$$ … $$
沿著:
--loop-playlist=<N|inf|force|no>, --loop-playlist
循環播放 N 次。值 1 播放一次(預設), 2 兩次等。 inf 表示永遠。no 與 1 相同並禁用循環。如果在命令行中指定了多個文件,則循環播放整個播放列表。
--loop-playlist
是一樣的--loop-playlist=inf
。
mpv
還注意不在影片視窗中創建任何閃爍。對於更長的合理播放列表
video_file_*
,可以用 替換(使用適當的變體sort
)$(printf '%s\n' video_file_* | sort -V)
,但這不會處理空格和其他字元。所以使用
find
+xargs
允許處理任何特殊字元(這可能仍然會阻塞mpv本身)但會破壞互動式控制的tty控制,所以在這裡它被人為地恢復為</dev/tty
:find -type f -name 'video_file_*' -print0 | sort -V -z | xargs -0 -- sh -c 'exec mpv </dev/tty --gapless-audio=yes --loop-playlist=inf -- "$@"'
注意:最近版本
mpv
已經重定向/dev/tty
回自己。更新:
mpv
可以--wid=
選擇將自己嵌入到另一個視窗中。因此,如果從為此準備了一個視窗的應用程序產生,它可以由應用程序給出目標視窗的參數。從手冊:--wid=<ID>
這告訴 mpv 附加到現有視窗。如果選擇了支持此選項的 VO,它將使用該視窗進行影片輸出。mpv 會將影片縮放到此視窗的大小,如果影片的縱橫比不同,則會添加黑條以進行補償。
在 X11 上,ID 被解釋為 X11 上的一個視窗。
$$ … $$
因此,在 X11 上不需要太多程式碼,
xwininfo
用於檢索視窗的 Window id,例如:0xdeadbeef
,可以mpv --wid=0xdeadbeef ...
將其嵌入到該視窗中。例如,它在一個簡單的xterm
. 任何更高級的使用都可能涉及將libmpv嵌入到其他程序中。這裡還有指向 X11 的XReparentWindow的指針(但mpv
應該負責這樣做):
- 將屬於我啟動的獨立程序的X11視窗嵌入到我自己的視窗中?
- XLib:用正確翻譯的彈出視窗重新設置Java視窗(但AFAIK,OP的目標是相反的)
xdotool
有windowreparent
命令。