简单记录一下FFmpeg中libavdevice注册设备的函数avdevice_register_all()。avdevice_register_all()在编程中的使用
在使用libavdevice之前,必须先运行avdevice_register_all()对设备进行注册,否则就会出错。avdevice_register_all()的注册方式和av_register_all()、avcodec_register_all()这几个函数是类似的。可以参考文章:
《FFmpeg 源代码简单分析:av_register_all()》
avdevice_register_all()代码如下。
从代码中可以看出,avdevice_register_all()调用3个函数进行设备组建的注册:REGISTER_INDEV(),REGISTER_OUTDEV(),REGISTER_INOUTDEV()。上述3个函数实际上是预定义的3个宏: REGISTER_INDEV():注册输入设备。实际上调用了av_register_input_format()将输入设备注册成一个AVInputFormat。 REGISTER_OUTDEV():注册输出设备。实际上调用了av_register_output_format()将输出设备注册成一个AVOutputFormat。 REGISTER_INOUTDEV():注册输入设备和输出设备。实际上将上述两个宏定义合并了。
在使用libavdevice之前,必须先运行avdevice_register_all()对设备进行注册,否则就会出错。avdevice_register_all()的注册方式和av_register_all()、avcodec_register_all()这几个函数是类似的。可以参考文章:
《FFmpeg 源代码简单分析:av_register_all()》
avdevice_register_all()代码如下。
/*
* 雷霄骅
*/
#include "config.h"
#include "avdevice.h"
//输出设备
#define REGISTER_OUTDEV(X, x) \
{ \
extern AVOutputFormat ff_##x##_muxer; \
if (CONFIG_##X##_OUTDEV) \
av_register_output_format(&ff_##x##_muxer); \
}
//输入设备
#define REGISTER_INDEV(X, x) \
{ \
extern AVInputFormat ff_##x##_demuxer; \
if (CONFIG_##X##_INDEV) \
av_register_input_format(&ff_##x##_demuxer); \
}
//输入输出设备
#define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x)
void avdevice_register_all(void)
{
static int initialized;
if (initialized)
return;
initialized = 1;
/* devices */
REGISTER_INOUTDEV(ALSA, alsa);
REGISTER_INDEV (AVFOUNDATION, avfoundation);
REGISTER_INDEV (BKTR, bktr);
REGISTER_OUTDEV (CACA, caca);
REGISTER_OUTDEV (DECKLINK, decklink);
REGISTER_INDEV (DSHOW, dshow);
REGISTER_INDEV (DV1394, dv1394);
REGISTER_INOUTDEV(FBDEV, fbdev);
REGISTER_INDEV (GDIGRAB, gdigrab);
REGISTER_INDEV (IEC61883, iec61883);
REGISTER_INDEV (JACK, jack);
REGISTER_INDEV (LAVFI, lavfi);
REGISTER_INDEV (OPENAL, openal);
REGISTER_OUTDEV (OPENGL, opengl);
REGISTER_INOUTDEV(OSS, oss);
REGISTER_INOUTDEV(PULSE, pulse);
REGISTER_INDEV (QTKIT, qtkit);
REGISTER_OUTDEV (SDL, sdl);
REGISTER_INOUTDEV(SNDIO, sndio);
REGISTER_INOUTDEV(V4L2, v4l2);
// REGISTER_INDEV (V4L, v4l
REGISTER_INDEV (VFWCAP, vfwcap);
REGISTER_INDEV (X11GRAB, x11grab);
REGISTER_OUTDEV (XV, xv);
/* external libraries */
REGISTER_INDEV (LIBCDIO, libcdio);
REGISTER_INDEV (LIBDC1394, libdc1394);
}
从代码中可以看出,avdevice_register_all()调用3个函数进行设备组建的注册:REGISTER_INDEV(),REGISTER_OUTDEV(),REGISTER_INOUTDEV()。上述3个函数实际上是预定义的3个宏: REGISTER_INDEV():注册输入设备。实际上调用了av_register_input_format()将输入设备注册成一个AVInputFormat。 REGISTER_OUTDEV():注册输出设备。实际上调用了av_register_output_format()将输出设备注册成一个AVOutputFormat。 REGISTER_INOUTDEV():注册输入设备和输出设备。实际上将上述两个宏定义合并了。
收藏的用户(0) X
正在加载信息~
推荐阅读
打开显示interface.png 或者显示interface.swf
最新回复 (0)
站点信息
- 文章2321
- 用户1336
- 访客12073073
每日一句
Thank yourself for your hard work, and forgive your imperfect past.
感谢努力的自己,也原谅不完美的过往。
感谢努力的自己,也原谅不完美的过往。
CreateProcessW要注意的细节问题
《http篇》boost.asio下载和编译
You Only Look Once:Unified, Real-Time Object Detection-CVPR-2016
快来学习Google出品的序列化神器Protocol Buffer
iOS的Charts开源项目使用说明
Android高权限截图例子
How to Ungroup Icons on Windows 11 Taskbar With a Registry Hack (and 2 More Ways)
软件测试教程:如何执行测试
DuiLib编译出错:成员声明中不允许限定名
华为手机app闪退重启界面清空log日志问题