동영상의 ffmpeg 및 자막으로 추출한 프레임을 매핑하는 방법은 무엇입니까? (프레임 정확도 문제)

닉 스카이 워커

ffmpeg를 사용하여 자막을 구운 비디오에서 프레임의 자막을 포함하는 ffmpeg로 추출한 프레임에 대한 텍스트 파일을 생성하고 싶습니다.

python 스크립트 pysrt를 사용하여 subrip 파일을 열고 텍스트 파일을 생성합니다. 제가하고 있는가하면, 각 프레임은 그 후, FFmpeg에 의해 프레임 번호라는 점이다 그들이 일정한 비율로 압축되어 있기 때문에, I 쉽게 수식을 사용하여 상기 프레임의 시간 위치를 검색 할 수있다 t1 = fnum/fps, 여기서, fnum검색 프레임의 수는 파일명으로하고, fps프레임 추출 FFmpeg를 주파수로 전달된다.

동일한 자막 파일을 사용하여 타임 라인의 텍스트 위치를 검색하지만 비디오에 사용 된 텍스트 위치는 여전히 정확도 오류가 발생합니다. 대부분의 텍스트 파일이 누락되었거나 존재하지 않아야하는 일부 파일이 있습니다.

프레임에 대해 말할 때 시간이 실제로 연속적이지 않기 때문에 t하드 코딩 된 자막과 함께 비디오의 fps를 사용하여 재 보정 시도 했습니다. 비디오 fps에 vfps대해 해당 fps 호출하겠습니다 (자막 굽기 전후에 비디오 fps가 동일하다는 것을 확인했습니다). . 나는 공식을 얻는다 : t2 = int(t1*vfps)/vfps. 여전히 100 % 정확하지는 않습니다.

예를 들어 내 비디오는 30fps ( vfps=30)이고 프레임은 4fps ( fps=4)로 추출되었습니다 . 추출 된 프레임 166 ( fnum=166)에는 자막이 표시되지 않는다. subrip 파일에서 이전 자막은에서 끝나고 t_prev=41.330다음 자막은에서 시작합니다. t_next=41.400즉, t_sub을 충족해야 t_prev < t_sub and t_sub < t_next하지만이 작업을 수행 할 수 없습니다.

내가 시도한 공식 :

t1 = fnum/fps  # 41.5 > t_next
t2 = int(fnum*vfps/fps)/vfps  # 41.5 > t_next
# is it because of a indexing problem? No:
t3 = (fnum-1)/fps  # 41.25 < t_prev
t4 = int((fnum-1)*vfps/fps)/vfps  # 41.23333333 < t_prev
t5 = int(fnum*vfps/fps - 1)/vfps  # 41.466666 > t_next
t6 = int((fnum-1)*vfps/fps + 1)/vfps  # 41.26666 < t_prev

사용 된 명령 :

# burning subtitles
# (previously)
# ffmpeg -r 25 -i nosub.mp4 -vf subtitles=sub.srt withsub.mp4
# now:
ffmpeg -i nosub.mp4 -vf subtitles=sub.srt withsub.mp4
# frames extraction
ffmpeg -i withsub.mp4 -vf fps=4 extracted/%05.bmp -hide_banner

왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?

내가 알아 차린 한 가지는 원본 비디오와 자막의 프레임을 추출하고 프레임의 차이를 만들면 그 결과는 자막뿐 아니라 배경에도 변화가 있다는 것입니다. 같은 영상을 두 번 사용하여 같은 경험을한다면 그 차이는 null이되어 프레임 추출이 일관적임을 의미합니다.

차이점에 대한 코드 :

ffmpeg -i withsub.mp4 -vf fps=4 extracted/%05.bmp -hide_banner
ffmpeg -i no_sub.mp4 -vf fps=4 extracted_no_sub/%05.bmp -hide_banner
for img in no_sub/*.bmp; do
    convert extracted/${img##*/} $img -compose minus -composite diff/${img##*/}
done

감사.

Gyan

정확한 타임 스탬프가있는 프레임을 추출 할 수 있으므로

ffmpeg -i nosub.mp4 -vf subtitles=sub.srt,settb=AVTB,select='if(eq(n\,0)\,1\,floor(4*t)-floor(4*prev_t))' -vsync 0 -r 1000 -frame_pts true extracted/%08d.bmp

이렇게하면 1/4 초마다 첫 번째 프레임이 추출됩니다. 출력 파일 이름은 8 자이며 처음 5 자리는 초이고 마지막 3 자리는 밀리 초입니다. 최대 파일 기간에 따라 필드 크기를 변경할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관