2012-09-05 2 views
0

FFMPEG.exe를 사용하여 다양한 비디오에서 프레임을 추출합니다. 이것은 프로그래밍 방식의 솔루션이며 전체 프레임 수 및/또는 지속 시간을 (ffprobe를 사용하여) 까다로울 수 있으므로 콘솔 출력을 사용하여 개별 프레임의 타임 스탬프를 감지 할 수 있다고 생각하지만 N 프레임마다 단일 출력 라인을 얻고 있습니다. like :FFMPEG에서 각 추출 된 프레임에 대한 로그 라인 얻기

frame= 20 fps=0.0 q=0.0 size=  0kB time=00:00:01.72 bitrate= 0.0kbits/s 
frame= 40 fps= 38 q=0.0 size=  0kB time=00:00:04.02 bitrate= 0.0kbits/s 
frame= 60 fps= 39 q=0.0 size=  0kB time=00:00:06.14 bitrate= 0.0kbits/s 
frame= 70 fps= 38 q=0.0 Lsize=  0kB time=00:00:07.86 bitrate= 0.0kbits/s 

각 프레임마다 강제로 출력 할 수있는 명령 줄 옵션이 있습니까? 그렇다면 time= 부분을 추출 할 수 있습니다. 이 기능은 현재 사용되는 명령 줄입니다 :

ffmpeg.exe -i video.avi -y -threads 0 -vsync 2 %10d.jpeg 

이상적으로, 프레임의 타임 스탬프를 기록 다른 형식 %10d.jpeg를 교체하지만 난이 존재 생각하지 않습니다.

답변

3

타임 스탬프를 잘못받는 방법입니다. 타임 스탬프를 얻으려면 ffprobe -show_packets 또는 ffprobe -show_frames를 사용하고 출력을 구문 분석하십시오. ffmpeg 파이프 라인의 시간은 모든 프레임이 아닌 몇 ms마다 한 번씩 업데이트됩니다. \

EDIT ffprobe는 파일에서 실행 중이므로 가능한 한 빨리 실행됩니다. 인쇄되는 타임 스탬프는 파일이 재생 된 경우 프레임의 실제 표시 및 디코드 타임 스탬프입니다.

ffmpeg가 실행 중일 때 타임 스탬프를 사용하려면 ffmpeg의 코드를 변경하십시오. do_video_stats라는 함수가 있는데, 모든 함수가 ffmpeg.c에 인쇄됩니다. 원하는대로 조작 할 수 있어야합니다.

+0

감사합니다. 불행하게도,'ffprobe -show_frames'는 200fps로 프레임을 보여줍니다 (이것은 맞지 않습니다). 이 외에도'ffmpeg' 명령 행은 고유 한 프레임 만 추출하도록 조정되어 있으므로 추출 된 프레임을'ffprobe' 출력에 매핑 할 수 없습니다. – wpfwannabe

+0

갑자기 더 나은 우주에 살고있는 Im, 지금 나는 엉성한 ffmpeg 대신 끔찍한 일을하는 ffmpeg에서 엉터리 버전을 가지고있다. – Prospero

3

showinfo 같은 필터를 사용하여 다음과 같이

ffmpeg -nostats -i input.wmv -vsync passthrough -an -vf showinfo %10d.png 

그것은 출력을 생성 스트림을 파싱하고 pts_time 부를 사용

<..> 
    Stream mapping: 
     Stream #0:0 -> #0:0 (wmv2 -> png) 
    Press [q] to stop, [?] for help  
    n:0 pts:16550 pts_time:16.55 pos:4205325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:1 type:I checksum:95895BC9 plane_checksum:[95895BC9] 
    n:1 pts:24591 pts_time:24.591 pos:6685325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:0 type:P checksum:FF4CC015 plane_checksum:[FF4CC015] 
    'n=...' lines are repeated for each of the extracted frames. 

보다.

관련 문제