유용한 프레임을 삭제하지 않고 비디오 프레임 속도 줄이기


3

저 프레임 속도, 어쩌면 15fps, 어쩌면 10fps로 녹화 된 보안 카메라의 비디오가 있습니다. 이후 다른 사람이 25fps로 변환했습니다 (기간 변경없이). 여분의 중복 된 프레임이 추가되었다고 가정하고 원래 프레임이 표시된 정확한 시간을 약간 왜곡했을 수도 있습니다.

원래 프레임 속도로 ffmpeg로 비디오를 다시 인코딩하고 싶습니다. 유능한 실제 모션의 프레임. 방금 사용하면 fps 필터는 어떤 프레임을 유지하는지에 대해 선택적이 아니며, 반올림 오류로 인해 중복 프레임을 유지하고 유용한 프레임을 영구적으로 잃어 버리면 상황이 악화 될 수 있다고 가정합니다. 어쨌든 원래의 프레임 속도가 정확히 무엇인지 알 수 없기 때문에 필터에 어떤 번호를 알려야할지 모르겠습니다.

ffmpeg로이 비디오를 복구하려면 어떻게해야합니까?

ffmpeg -i "orig.mp4" -an -vcodec h264 -vf "fps=???" "fixed.mp4"

특히 변환기가 사용하는 정확한 "알고리즘"을 모르는 경우에는 수행 할 수 없을 것입니다. 풀다운 문제와 같은 소리가납니다.
Tom Yan

답변:


4

나는 내 파일을 고칠 수 있었다. 나는 mpdecimate 필터는 비디오 스트림에서 중복되거나 거의 중복 된 프레임을 삭제합니다. 먼저 내가 시도 :

ffmpeg -loglevel debug -i orig.mp4 -an -vf "mpdecimate" test.mp4

나는 추가했다. -loglevel debug 트랜스 코딩 중에 더 많은 정보를 얻으려면. 정보는 mpdecimate 이 패턴이 많고 많은 프레임을 가지고 일을하고있었습니다.

lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44032 pts_time:3.44 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44544 pts_time:3.48 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45056 pts_time:3.52 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45568 pts_time:3.56 drop_count:4
781>=hi keep pts:46080 pts_time:3.6 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:46592 pts_time:3.64 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47104 pts_time:3.68 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47616 pts_time:3.72 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:48128 pts_time:3.76 drop_count:4
821>=hi keep pts:48640 pts_time:3.8 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49152 pts_time:3.84 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49664 pts_time:3.88 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50176 pts_time:3.92 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50688 pts_time:3.96 drop_count:4
793>=hi keep pts:51200 pts_time:4 drop_count:-1

즉, 연속적으로 4 개의 프레임을 중복으로 삭제하고 매 5 초마다 유지하는 것이 었습니다. 이것은 원래의 프레임 속도가 현재의 1/5임을 보여 줬습니다. 나는 운이 좋았다! 비디오의 현재 25fps는 원래 프레임 속도의 배수이기 때문에 유지되고 끊어진 프레임의 일시적인 정렬이 잘못되어서는 안됩니다. 따라서 원본 비디오를 -vf "fps=5", 그리고 출력은 괜찮은 것 같았다. 확실하게, 나는 출력을 통해 mpdecimate 필터를 사용하고 나머지 모든 프레임을 "유지"로 감지했습니다. 그래서 원본 파일은 내가 생각한 것처럼 엉망이되지 않았습니다.


2

여분의 프레임이 중복되고 보간이 아닌 경우 다음이 작동합니다.

ffmpeg -i orig.mp4 -an -vf "select='gt(scene\,0.001)',setpts=N/(10*TB)" -r 10 fixed.mp4

아이디어는 이전 프레임의 복제본이 아닌 모든 프레임을 선택하는 것입니다. 그런 다음 PTSes는 지정된 출력 속도에 따라 재생성됩니다. 감지 필터를 올바르게 설정하려면 장면 값을 위나 아래로 조정해야 할 수도 있습니다. 비디오가 실시간보다 빠르거나 느린 경우 속도를 낮추거나 올립니다 (그리고 분모 값을 설정).


나는 이것이 효과가있을 것이라고 생각하지만 올바르게 조정하기가 어려웠다. 나는 결국 "mpdecimate"필터를 발견하고 각 프레임에 대해보다 명확한 "속이나 속지"결과를주는 것처럼 보였습니다.
Boann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.