-1

I make screen recordings with ffmpeg, using avfoundation on Mac OS X, x11grab on Linux and gdigrab on Windows.

The resulting files should be compatible with modern web browsers (<video/>), so I use H.264 codec and request YUV 4:2:0 Planar pixel format.

On Mac OS X, however (unlike Linux and Windows), I receive the following logging:

/usr/local/bin/ffmpeg -y -v error -f avfoundation -threads 0 -hide_banner -i 1:none -f mp4 -vcodec h264 -pix_fmt yuv420p -r 25/1 -qscale:v 1 -vf scale=-1:1080 target.mp4
[avfoundation @ 0x7fdba2003a00] Selected pixel format (yuv420p) is not supported by the input device.
[avfoundation @ 0x7fdba2003a00] Supported pixel formats:
[avfoundation @ 0x7fdba2003a00]   uyvy422
[avfoundation @ 0x7fdba2003a00]   yuyv422
[avfoundation @ 0x7fdba2003a00]   nv12
[avfoundation @ 0x7fdba2003a00]   0rgb
[avfoundation @ 0x7fdba2003a00]   bgr0

Still, according to mplayer, the resulting MP4 file seems to have YUV 4:2:0 Planar color model:

[h264 @ 0x1048a8ac0]Format yuv420p chosen by get_format().
[h264 @ 0x1048a8ac0]Reinit context to 1728x1088, pix_fmt: yuv420p
[h264 @ 0x1048a8ac0]Format yuv420p chosen by get_format().
[h264 @ 0x1048a8ac0]Reinit context to 1728x1088, pix_fmt: yuv420p
[swscaler @ 0x1048c3cc0]bicubic scaler, from yuv420p to yuyv422 using MMXEXT
*** [scale] Exporting mp_image_t, 1728x1080x12bpp YUV planar, 2799360 bytes
*** [vo] Allocating mp_image_t, 1728x1080x16bpp YUV packed, 3732480 bytes

the same confirmed by ffmpeg:

$ ffmpeg -i target.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'target.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:04.72, start: 0.000000, bitrate: 201 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1728x1080, 197 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler

Questions:

  1. Can someone explain the above ffmpeg logging?
  2. If I still need to convert the avfoundation video stream to yuv420p, how do I make it on the fly (in a single ffmpeg pass)?
Bass
  • 4,011
  • 2
  • 26
  • 67

1 Answers1

1

The avfoundation module has its pixel format default set to yuv420p. When not available, it will print that warning and attempt to select another format. You should see a line below that warning starting with Overriding selected pixel format to use ..

If the output's fine, this can be ignored. You don't need a second pass or any other change.

Gyan
  • 63,018
  • 7
  • 100
  • 141
  • Thank you for your response. At the `WARNING` log level, I indeed see `Overriding selected pixel format to use uyvy422 instead`, which seems inconsistent with `ffmpeg -i` output, which clearly reports `yuv420p`. – Bass May 30 '19 at 19:24
  • 1
    Your command has `-pix_fmt yuv420p` so ffmpeg will convert to that, regardless of what the input is. – Gyan May 30 '19 at 19:28
  • How do I change? – chovy Mar 15 '21 at 19:43