FFprobe - 비디오 스트림을 다시 인코딩하지 않고 "탐색 위치"를 얻을 수 있습니까?

FFprobe - 비디오 스트림을 다시 인코딩하지 않고 "탐색 위치"를 얻을 수 있습니까?

다음 명령이 있습니다.

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss 3 -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

ffprobe비디오 스트림을 다시 인코딩하는 대신 복사할 때 비디오 스트림의 원하는 위치를 알려주는 유용한 정보를 얻을 수 없습니다 .

전체 스트림에 대한 정보를 수집해 보았습니다.

ffprobe -of json -show_streams -show_format output.mp4

그러나 지속 기간은 영향을 받지 않습니다 start_time. 0또한 비디오 스트림의 첫 번째 프레임에 대한 정보 수집을 시도했습니다.

ffprobe -of json -select_streams v -show_frames output.mp4

아직 유용한 정보가 없습니다.

-c:v copy그러나 명령에서 제거하여 비디오 스트림을 다시 인코딩하면 원하는 정보를 얻을 수 있습니다. 비디오 스트림 지속 시간은 -ss옵션에 의해 수정됩니다. 예를 들어 비디오의 지속 시간이 5인 경우 ffprobe2(5 - 3)의 지속 시간을 반환하여 찾고 있는 위치를 알 수 있습니다. -copyts믹스에 a도 추가하면 첫 번째 프레임의 정보를 확인하여 유용한 정보를 얻을 수 있습니다.

비디오 스트림을 다시 인코딩하지 않고도 원하는 위치를 어떻게 얻을 수 있습니까? 건배!

답변1

원본 파일에 접근할 수 있고 이를 사용한 경우

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss X -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

그런 다음 이 방법을 따르세요.

1) 소스 비디오 스트림의 지속 시간 얻기

ffprobe source.mp4 -show_entries stream=duration -select_streams v -of compact=p=0 -v 0

출력 예:

duration=229.033333

2) 결과 비디오 스트림의 지속 시간과 첫 번째 PTS를 얻습니다.

ffprobe output.mp4 -show_entries packet=pts_time:stream=duration -select_streams v -read_intervals 0%+#1 -of compact=p=0 -v 0

출력 예:

pts_time=0.066667
duration=220.700000

따라서 결과의 첫 번째 프레임은 소스 스트림의 229.033333 - 220.700000= 입니다.8.333333s

-ss그러나 이는 키프레임을 가리키지 않을 수 있으므로 -ss 값이 아닙니다 .

3) 따라서 첫 번째 오디오 패킷의 지속 시간과 PTS를 얻습니다. ffmpeg는 오디오를 지정된 프레임과 동기화하는 데 오랜 시간을 제공합니다 -ss.

ffprobe output.mp4 -show_entries packet=pts_time,duration_time -select_streams a -read_intervals 0%+#1 -of compact=p=0 -v 0

출력 예:

pts_time=0.000000|duration_time=2.733333

따라서 8.333333s + 2.733333 - 0.000000 - 0.066667=는 11.000000s찾는 프레임입니다.

관련 정보