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
하지만 이 코드는 각 비디오 파일 사이의 창을 닫았다가 다시 엽니다. 이는 원하지 않습니다. 어떻게 해야 하나요?
편집: JFrame 내부에 스트림이 표시되는 Java 프로젝트를 구축 중입니다. 그래서 나는 이 기능이 JFrame 내부에 표시되기를 원합니다.
답변1
mpv --gapless-audio=yes --loop-playlist=inf video_file_*
원활한 재생을 활성화하는 방법매뉴얼에 기록된:
--gapless-audio=<no|yes|weak>
파일이 변경될 때 무음이나 중단 없이 연속 오디오 파일을 재생해 보세요. 기본값: 약함.
no
: 원활한 오디오를 비활성화합니다.
yes
: 재생되는 첫 번째 파일에 대해 선택된 매개변수로 오디오 장치를 연 다음 원활한 재생을 위해 열어 둡니다. 즉, 첫 번째 파일의 샘플링 속도가 더 낮으면 후속 파일도 동일한 낮은 샘플링 속도로 다시 샘플링되어 음질이 저하될 수 있습니다. 다른 매개변수를 사용하여 파일을 재생하는 경우 --audio-samprate 및 --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
모든 특수 문자에 사용할 수 있습니다(여전히 초크홀드일 수 있음).유틸리티 차량자체)하지만 방해가 됩니다.단말기컨트롤은 대화형 컨트롤이므로 여기에서 이를 복원하기 위해 인위적으로 사용됩니다 </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
더 고급 용도로 사용하려면 간단한 .포함시키다라이브러리 파일다른 프로그램 입력. X11에 대한 포인터도 있습니다.XReparentWindow(그러나 mpv
그렇게 하는 것에 대한 책임은 있어야 합니다):
- 내가 시작한 별도의 프로세스에 속하는 X11 창을 내 창에 포함하시겠습니까?
- XLib: 올바르게 번역된 팝업으로 Java 창 상위 다시 지정(그러나 내가 아는 한 OP의 목표는 반대입니다)
xdotool
주문이 있습니다windowreparent
.