Dump last frame of video file using ffmpeg/mencoder/transcode et. al

后端 未结 5 1639
执笔经年
执笔经年 2021-01-01 18:21

I\'d like to grab the last frame in a video (.mpg, .avi, whatever) and dump it into an image file (.jpg, .png, w

相关标签:
5条回答
  • 2021-01-01 18:22

    One thing I have not seen mentioned is that the expected frame count can be off if the file contains dupes. If your method of counting frames is causing your image extraction command to come back empty, this might be what is mucking it up.

    I have developed a short script to work around this problem. It is posted here.

    0 讨论(0)
  • 2021-01-01 18:28

    I found that I had to add -vsycn 2 to get it to work reliably. Here's the full command I use:

    ffmpeg -y -sseof -3 -i $file -vsync 2 -update 1 -vf scale=640:480 -q:v 1 /tmp/test.jpg
    

    If you write to a NFS folder then the results will be very inconsistent. So I write to /tmp then copy the file once done. If it is not done, I do a kill -9 on the process ID.

    0 讨论(0)
  • 2021-01-01 18:29

    This isn't a complete solution, but it'll point you along the right path.

    Use ffprobe -show_streams IN.AVI to get the number of frames in the video input. Then

    ffmpeg -i IN.AVI -vf "select='eq(n,LAST_FRAME_INDEX)'" -vframes 1 LAST_FRAME.PNG
    

    where LAST_FRAME_INDEX is the number of frames less one (frames are zero-indexed), will output the last frame.

    0 讨论(0)
  • 2021-01-01 18:35

    I have a mp4 / h264 matroska input video file. And none of the above solutions worked for me. (Although I sure they work for other file formats).

    Combining samrad's answer above and also this great answer and came up with this working code:

    input_fn='output.mp4'
    
    image_fn='output.png'
    
    rm -f $image_fn
    
    frame_count=`ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 $input_fn`
    
    ffmpeg -i $input_fn -vf "select='eq(n,$frame_count-1)'" -vframes 1 "$image_fn" 2> /dev/null
    
    0 讨论(0)
  • 2021-01-01 18:46

    I couldn't get Nelson's solution to work. This worked for me. https://gist.github.com/samelie/32ecbdd99e07b9d8806f

    EDIT (just in case the link disappears, here is the shellscript—bobbogo):

    #!/bin/bash
    
    fn="$1"
    of=`echo $1 | sed s/mp4/jpg/`
    
    lf=`ffprobe -show_streams "$fn" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2`
    rm -f "$of"
    let "lf = $lf - 1"
    ffmpeg -i $fn -vf select=\'eq\(n,$lf\) -vframes 1 $of
    
    0 讨论(0)
提交回复
热议问题