FFmpeg的avdevice_register_all()用于注册输入/输出设备,属于libavdevice模块,是libavformat模块的补充,包含muxers与demuxers两部分。设备与平台相关,比如Android、iOS、Windows、Mac、Linux等不同平台提供不同设备。
libavdevice模块的描述如下(位于libavdevice/avdevice.h):
/**
* @defgroup lavd libavdevice
* Special devices muxing/demuxing library.
*
* Libavdevice is a complementary library to @ref libavf "libavformat". It
* provides various "special" platform-specific muxers and demuxers, e.g. for
* grabbing devices, audio capture and playback etc.
*
* To use libavdevice, simply call avdevice_register_all() to register all
* compiled muxers and demuxers. They all use standard libavformat API.
*
*/
描述中有提到,调用avdevice_register_all()来注册所有已编译的muxers/demuxers设备。我们来看下注册设备的方法,位于libavdevice/alldevices.c中:
void avdevice_register_all(void)
{
avpriv_register_devices(outdev_list, indev_list);
}
内部调用avpriv_register_devices()进行注册,该方法位于libavformat/allformats.c,这就印证上面提及的说法:libavdevice是libavformat的补充。具体代码如下:
void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[])
{
ff_mutex_lock(&avpriv_register_devices_mutex);
outdev_list = o;
indev_list = i;
ff_mutex_unlock(&avpriv_register_devices_mutex);
#if FF_API_NEXT
av_format_init_next();
#endif
}
注册过程很简单,只是给outdev_list和indev_list数组赋值。我们再回头看这两个数组,其实是编译期自动生成的。indev_list数组,在indev_list.c文件中;outdev_list数组,在outdev_list.c文件中。indev_list和outdev_list的设备都是根据alldevices.c中声明的全局变量来生成,变量列表如下:
/* devices */
extern AVInputFormat ff_alsa_demuxer;
extern AVOutputFormat ff_alsa_muxer;
extern AVInputFormat ff_android_camera_demuxer;
extern AVOutputFormat ff_audiotoolbox_muxer;
extern AVInputFormat ff_avfoundation_demuxer;
extern AVInputFormat ff_bktr_demuxer;
extern AVOutputFormat ff_caca_muxer;
extern AVInputFormat ff_decklink_demuxer;
extern AVOutputFormat ff_decklink_muxer;
extern AVInputFormat ff_dshow_demuxer;
extern AVInputFormat ff_fbdev_demuxer;
extern AVOutputFormat ff_fbdev_muxer;
extern AVInputFormat ff_gdigrab_demuxer;
extern AVInputFormat ff_iec61883_demuxer;
extern AVInputFormat ff_jack_demuxer;
extern AVInputFormat ff_kmsgrab_demuxer;
extern AVInputFormat ff_lavfi_demuxer;
extern AVInputFormat ff_openal_demuxer;
extern AVOutputFormat ff_opengl_muxer;
extern AVInputFormat ff_oss_demuxer;
extern AVOutputFormat ff_oss_muxer;
extern AVInputFormat ff_pulse_demuxer;
extern AVOutputFormat ff_pulse_muxer;
extern AVOutputFormat ff_sdl2_muxer;
extern AVInputFormat ff_sndio_demuxer;
extern AVOutputFormat ff_sndio_muxer;
extern AVInputFormat ff_v4l2_demuxer;
extern AVOutputFormat ff_v4l2_muxer;
extern AVInputFormat ff_vfwcap_demuxer;
extern AVInputFormat ff_xcbgrab_demuxer;
extern AVOutputFormat ff_xv_muxer;
/* external libraries */
extern AVInputFormat ff_libcdio_demuxer;
extern AVInputFormat ff_libdc1394_demuxer;
按照平台划分,有Android、iOS、Windows、Mac、Linux等平台。也有跨平台的库、第三方库。
Android设备:
extern AVInputFormat ff_android_camera_demuxer;
iOS与Mac设备:
extern AVOutputFormat ff_audiotoolbox_muxer;
extern AVInputFormat ff_avfoundation_demuxer;
linux设备:
extern AVInputFormat ff_alsa_demuxer;
extern AVOutputFormat ff_alsa_muxer;
extern AVInputFormat ff_fbdev_demuxer;
extern AVOutputFormat ff_fbdev_muxer;
extern AVInputFormat ff_v4l2_demuxer;
extern AVOutputFormat ff_v4l2_muxer;
Windows设备:
extern AVInputFormat ff_decklink_demuxer;
extern AVOutputFormat ff_decklink_muxer;
extern AVInputFormat ff_dshow_demuxer;
extern AVInputFormat ff_gdigrab_demuxer;
extern AVOutputFormat ff_sdl2_muxer;
extern AVInputFormat ff_vfwcap_demuxer;
extern AVInputFormat ff_xcbgrab_demuxer;
extern AVOutputFormat ff_xv_muxer;