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
감사.
정확한 타임 스탬프가있는 프레임을 추출 할 수 있으므로
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] 삭제
몇 마디 만하겠습니다