[FFmpeg-user] How to open avfoundation via C

Jeroen Ooms jeroenooms at gmail.com
Tue Oct 9 14:14:07 EEST 2018


On Tue, Oct 9, 2018 at 11:55 AM Jeroen Ooms <jeroenooms at gmail.com> wrote:
>
> On Tue, Oct 9, 2018 at 2:36 AM Carl Eugen Hoyos <ceffmpeg at gmail.com> wrote:
> >
> > 2018-10-09 1:03 GMT+02:00, Jeroen Ooms <jeroenooms at gmail.com>:
> > > I would like to capture the screen in MacOS. This works via the command
> > > line:
> > >
> > >   Command line: ffmpeg -f avfoundation -i "1" -pix_fmt yuv420p -r 25
> > > -t 5 out.mov
> > >
> > > However I can't figure out how to do this in C. I tried the following,
> > > but it gives an error "Device selection unsupported.".
> > >
> > >   AVBufferRef *capture;
> > >   AVDictionary *opts = NULL;
> > >   av_dict_set(&opts, "video_device_index", "1", 0);
> > >   av_dict_set(&opts, "audio_device_index", "none", 0);
> > >   av_hwdevice_ctx_create(&capture, AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
> > >                                  "avfoundation", opts, 0);
> >
> > From the command line above, avfoundation
> > is a device / format, not a hwdevice.
>
> I don't understand, it is listed as a video device in
> av_input_video_device_next(). Which API is used to read from such an
> input then? I can only find command line examples for avfoundation, it
> is unclear to me how to capture the camera/screen in C.

Talking to myself here, but I figured it out sort of. After calling
avdevice_register_all() the "avfoundation" device will magically
appear as a regular demuxer format:

  avdevice_register_all();
  AVInputFormat *input = av_find_input_format("avfoundation");
  AVFormatContext *demuxer = NULL;
  avformat_open_input(&demuxer, "1", input, NULL)


More information about the ffmpeg-user mailing list