====== ffmpeg - Video - Duration ====== ===== Using Regex ===== # Use perl-regex. ffmpeg -i "input.mkv" -c copy -f null /dev/null 2>&1 | tail -n 1 | grep -Po "(?<=time=)([0-9]{1,2}:[0-9]{2}:[0-9]{2})" or # Use extended-regex. ffmpeg -i "input.mkv" -c copy -f null /dev/null 2>&1 | tail -n 1 | grep -oE "[0-9]{1}:[0-9]{2}:[0-9]{2}" or ffmpeg -i "input.mkv" -c copy -f null /dev/null 2>&1 | grep -oE "[0-9]{1}:[0-9]{2}:[0-9]{2}" | tail -n 1 or ffmpeg -i "input.mkv" 2>&1 | grep -oE "[0-9]{1}:[0-9]{2}:[0-9]{2}" | head -n 1 **NOTE:** This gets the figures directly from ffmpeg. * This returns an estimate of the duration based on the bitrate and size of the file. ---- ===== Getting the data from the video stream ===== ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "input.mkv" **NOTE:** This often returns N/A for .mkv files. ---- ===== Getting the data from the container ===== ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "input.mkv" ffprobe -v error -select_streams v:0 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "input.mkv" **WARNING:** This returns the duration of the entire container, and not just the duration of the video. ---- ===== By Packet duration_time ===== This method reads each video packet, individually, and totals up each packet size. * Sums up the **duration_time** of the **-show_entries** command. video_pkt_durations=$(ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries packet=duration_time -of default=nokey=1:noprint_wrappers=1 "input.mkv") sum_video_pkt_duration=0 precision=6 count_video_pkt_duration=0 #echo "Calculating video pkt_duration..." for video_pkt_duration in $video_pkt_durations; do sum_video_pkt_duration=$(echo "${sum_video_pkt_duration} + ${video_pkt_duration}" | bc) (( count_video_pkt_duration++ )) done; video_duration=$( echo "scale=${precision}; ${sum_video_pkt_duration} " | bc) echo "DURATION=${video_duration}" echo "VIDEO FRAMES=${count_video_pkt_duration}" **NOTE:** This is very accurate but may take a while. ---- ===== Calculate duration using Size and Bitrate ===== duration=$( echo "scale=6; (${video_size} * 8) / ${bitrate}" | bc) ---- ===== Calculate duration using Size and Bitrate ===== duration = NUMBER_OF_FRAMES / FPS **NOTE:** Returns the duration in seconds. ----