ffmpeg 선택 필터를 사용하여 정확한 프레임에서 비디오 자르기


16

정확하지 않은 것으로 보이는 매개 변수 를 사용 -ss하고 -to찾는 대신 지정된 프레임 번호에 대해 비디오를자를 수 있습니까? 예를 들어;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[80 번째 프레임과 560 번째 프레임 포함. 따라서 전체적으로 (560-80 +1) 프레임을 만듭니다.]

답변과 약간의 검색 후, 나는 몇 가지 명령을 시도했습니다. 그러나 지금까지 나는 수용 가능한 방법을 찾지 못했습니다.

누군가가 250 ~ 750 번째 프레임 사이에서 비디오 스트림을 잘라내려면이 방법을 사용하십시오. 501 프레임을 출력으로 제공합니다.

참고 : movie.mp4는 25fps이며 오디오 샘플 속도는 48k입니다.

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

예상대로 출력은 정확히 20 초입니다.

오디오에 동일한 방법을 사용합니다.

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

예기치 않게이 정확도는 매우 떨어집니다. 그것은 20 초 오디오와 같은 960001 (960k + 1) 샘플을 제공해야합니다. 그러나 대신 출력은 20.505 초이고 984240 개의 샘플이 있습니다. 또한 지속 시간을 늘리면 오류도 증가합니다.

그런 다음 오디오 스트림을 절단하기 위해 -ss -to 매개 변수를 사용하려고했습니다.

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

오래된 고전적인 방식이 훨씬 잘 작동합니다. 출력 길이는 20.003 초이며 샘플은 960144입니다. 또한 지속 시간을 늘리면 오류가 증가하지 않으며 오류는 일정하며 해당 입력 파일에는 항상 144 개의 샘플 잉여가 있습니다.

요약 : select필터는 대부분 잘 작동하지만 선택은 그렇지 않습니다. 클래식 -ss매개 변수는 오디오에는 더 효과적이지만 샘플 정확도는 아닙니다. 또한 오디오와 비디오 스트림 모두에 영향을 미치지 만 오디오에만 영향을 미치기 때문에 -vf select-ss매개 변수를 함께 사용할 수 없습니다 -ss.

따라서 미디어 파일을 정확하게 잘라내려면 다음 3 단계를 수행해야합니다.

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

가장 정확한 결과를 제공합니다. 비디오 길이는 20.000 초이고 프레임 정확한 오디오 길이는 20.003 초이며 샘플은 960144입니다. 비디오 스트림과 정확히 일치하지는 않지만 괜찮습니다. 144 개의 샘플 잉여가 있습니다. 가장 큰 단점은 파일을자를 때마다 간단한 작업을 위해 3 개의 명령을 보내야하며 a_stream.webm 및 v_stream.webm이라는 두 개의 불필요한 파일을 생성한다는 것입니다. 그리고 select시도한 일부 입력 파일 에서 필터가 작동하지 않습니다. 작업을 성공적으로 수행하지만 (?) 인코딩 프로세스를 중지하지 않으므로 매번 명령 프롬프트를 닫아야합니다.


이 질문을 게시하기 전에 해당 페이지를 읽었습니다. 그 페이지는 나에게 도움이되지 않았다. 입력에 변수 fps가있는 경우 간단히 그 방정식을 사용하여 계산할 수 있습니까? 나는 그렇게 생각하지 않습니다. 또한 여전히 '-ss'가 정확한 위치를 제공한다고 생각하지 않습니다. 프레임별로 탐색하는 것이 더 좋습니다.
destor

참고 -ss정확한 프레임입니다 (참고 여기 ). 실제로 변수 -fps 입력이 있습니까? 내 답변 select은 프레임 번호를 지정할 수있는 필터 사용을 언급하는 메일 목록 스레드로 연결됩니다 . 당신은 그것을 시도 했습니까?
slhck

내가 사용하는 시도 selectaselect비디오 및 오디오 스트림에 대한 필터링합니다. Select동영상의 프레임 정확도는 정확하지만 aselect샘플 정확도는 아닙니다. 실제로는 정확하지 않습니다. 간단한 -ss -to매개 변수를 사용하는 것보다 훨씬 더 나쁜 결과를 제공합니다 . 그로 인해 현재로서는 가장 정확한 절삭을 달성하기 위해 select필터와 -ss -to매개 변수 조합을 사용 합니다. 그러나 그렇게하는 것은 지저분한 방법입니다. 내가 어떤 commandlines과 그 결과를 추가 한 내 첫 번째 게시물 제발 봐
destor

ffmpeg 버전?
저런

어떻게 든 프레임 번호로 자르려고합니까? 그런 종류의 정확성이 필요하다면 왜 avidemux를 사용하지 않습니까? 또한 가장 가까운 키 프레임을 선택하기 때문에 원래 문제가 발생했을 수 있습니다.
저런

답변:


3

오디오는 프레임이 아닌 초 단위로 제공되므로 비디오를 자르려면 다음과 같이 비디오 fps × 20 초를 계산해야합니다. 23.97fps의 20 초 = 479.4

마지막 1 초 동안 전체 fps를 얻을 수 없기 때문에 프레임 절단이 정확하지 않으므로 오디오는 더 많은 초 또는 단지 0.5 초 또는 조금 더 많게됩니다! 정확한 컷을 얻기 위해 프레임 대신 초를 사용해야 할 수도 있습니다. 그리고 1 개의 여분의 프레임을 얻는다면 250 번째와 750 번째 프레임을 250 번째와 749 번째 프레임으로 바꾸는 것은 어떨까요?! 빼기 1을 사용하면 항상 얼마나 많은 프레임을 요청할 수 있습니다!


실제로 오디오는 몇 초가 아닌 샘플에서 나옵니다 ...
Anubioz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.