25

I am trying to determine video bitrate(For transcoding) using ffmpeg command,I tried following command.

ffmpeg -i 28572615.wmv

and it produces the following output

    Input #0, asf, from '28572615.wmv':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    encoder         : Lavf57.36.100
  Duration: 00:02:50.92, start: 0.000000, bitrate: 1982 kb/s
    Stream #0:0: Video: wmv2 (WMV2 / 0x32564D57), yuv420p, 640x360, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 1k tbc
    Stream #0:1: Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, 2 channels, fltp, 128 kb/s
At least one output file must be specified

If I use another video

ffmpeg -i with_out_sound.mp4

then i get the following output

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'with_out_sound.mp4':
  Metadata:
    major_brand     : dash
    minor_version   : 0
    compatible_brands: iso6avc1mp41
    creation_time   : 2015-04-21 05:14:57
  Duration: 00:00:27.86, start: 0.000000, bitrate: 500 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 622x480 [SAR 1:1 DAR 311:240], 100 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc (default)
    Metadata:
      creation_time   : 2015-04-21 05:14:57
      handler_name    : VideoHandler
At least one output file must be specified

The point I am confuse is that should I look in Duration metadata line or Video Stream metadata line(Stream #0:0) for video bitrate?

user2528012
  • 387
  • 1
  • 6
  • 11

2 Answers2

24

The video bitrate is displayed in the video stream info. The format info contains the bitrate for all streams plus muxing overhead.

If the video bitrate is missing, then a dirty way to get that value is by subtracting the bitrate of all other streams from the total bitrate.

If that's not viable, a cumbersome method is to run ffprobe to show packet sizes and stream duration and then calculating the bitrate by summing all lines except the last one, and dividing by the value in the last line.

ffprobe -select_streams v -show_entries packet=size:stream=duration -of compact=p=0:nk=1 video.mp4

Output:

4199      
2627      
1792      
3921      
2993      
...  
2301      
3076
2879
1543.00000

Of course, this is a last resort solution, and only applicable if the video stream info does not sport a bitrate and estimating the bitrate by discounting the rate of all other streams is not possible either.

Gyan
  • 34,439
  • 6
  • 56
  • 98
  • Note that you do not need `nk=1` when you use `csv` as the format (instead of `compact`). Also I had to use `2>/dev/null` to not get the default header about the stream. – Alexis Wilke Apr 06 '21 at 15:47
3

I'm not sure why you gave the bounty to the other answer (which didn't really explain how to get the bitrate apart from manually computing it), but the easiest way to get the bitrate of a video in proper format is to use FFMPEG's utility ffprobe

$ ffprobe -v quiet -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 inputvideo.mp4

This prints the raw bitrate value on its own so that you can easily use it in some kind of script.

Taken from here: https://write.corbpie.com/getting-video-bitrate-with-ffprobe/

rlittles
  • 150
  • 5
  • 2
    it results N/A . – ben Sep 05 '22 at 09:56
  • Can you post the output of `$ ffprobe `? It could have something to do with the format of your video. @benyamin – rlittles Sep 06 '22 at 07:10
  • @rlittles I get the same; this is with a video that I encoded in h.264 CRF from a formerly lossless ffv1 video capture that I inverse telecine'd. `Stream #0:0: Video: h264 (High 4:2:2), yuv422p(tv, progressive), 720x480, 23.98 fps, 23.98 tbr, 1k tbn` – Wyatt Ward May 08 '23 at 16:47
  • That's really weird. I tested it with an old H264 video and it worked. https://i.imgur.com/D0OIFwK.png This was on Windows, but I can't imagine that it would make a difference versus Linux. – rlittles May 08 '23 at 18:33