Bash

如何連續播放播放列表?

  • June 30, 2021

我有一個 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應該負責這樣做):

引用自:https://unix.stackexchange.com/questions/656396