当前位置:网站首页>Ffmpeg - sources analysis
Ffmpeg - sources analysis
2022-08-05 03:20:00 【hjjdebug】
ffmpeg -sources分析
----------------------------------------
author:hjjdebug
date: 2022年 08月 03日 星期三 16:42:27 CST
----------------------------------------
The output of the first to have a look at it:
$ ffmpeg -sources
Device name is not provided.
You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.
Auto-detected sources for alsa:
* default [Playback/recording through the PulseAudio sound server]
surround21 [2.1 Surround output to Front and Subwoofer speakers]
surround40 [4.0 Surround output to Front and Rear speakers]
surround41 [4.1 Surround output to Front, Rear and Subwoofer speakers]
surround50 [5.0 Surround output to Front, Center and Rear speakers]
surround51 [5.1 Surround output to Front, Center, Rear and Subwoofer speakers]
surround71 [7.1 Surround output to Front, Center, Side, Rear and Woofer speakers]
null [Discard all samples (playback) or generate zero samples (capture)]
samplerate [Rate Converter Plugin Using Samplerate Library]
speexrate [Rate Converter Plugin Using Speex Resampler]
jack [JACK Audio Connection Kit]
oss [Open Sound System]
pulse [PulseAudio Sound Server]
upmix [Plugin for channel upmix (4,6,8)]
vdownmix [Plugin for channel downmix (stereo) with a simple spacialization]
sysdefault:CARD=PCH [Default Audio Device]
front:CARD=PCH,DEV=0 [Front speakers]
dmix:CARD=PCH,DEV=0 [Direct sample mixing device]
dmix:CARD=PCH,DEV=2 [Direct sample mixing device]
dsnoop:CARD=PCH,DEV=0 [Direct sample snooping device]
dsnoop:CARD=PCH,DEV=2 [Direct sample snooping device]
hw:CARD=PCH,DEV=0 [Direct hardware device without any conversions]
hw:CARD=PCH,DEV=2 [Direct hardware device without any conversions]
plughw:CARD=PCH,DEV=0 [Hardware device with all software conversions]
plughw:CARD=PCH,DEV=2 [Hardware device with all software conversions]
usbstream:CARD=PCH [USB Stream Output]
usbstream:CARD=NVidia [USB Stream Output]
Auto-detected sources for oss:
Cannot list sources. Not implemented.
Auto-detected sources for sndio:
Cannot list sources. Not implemented.
Auto-detected sources for fbdev:
Could not open framebuffer device '/dev/fb0': Permission denied
Auto-detected sources for lavfi:
Cannot list sources. Not implemented.
Auto-detected sources for video4linux2,v4l2:
Auto-detected sources for x11grab:
Cannot list sources. Not implemented.
下面分析代码:
ffmpeg After analyzing options,调用了show_sources() 函数,关键代码如下:
fmt = 0;
do {
fmt = av_input_audio_device_next(fmt);
if (fmt) {
print_device_sources(fmt, opts);
}
} while (fmt);
do {
fmt = av_input_video_device_next(fmt);
if (fmt) {
print_device_sources(fmt, opts);
}
} while (fmt);
可见是2个循环.
First take a look at how to getfmt. ,由上一个format The next availableformat.
int i = 0;
while (prev && (fmt = indev_list[i])) {
i++;
if (prev == fmt) // fmt With an equal before stop.
break;
}
do {
fmt = indev_list[i++];
if (!fmt)
break;
category = pc->category;
} while (category != c1 && category != c2); //Find the next meets the requirements of,c1,c2是条件
return (AVInputFormat *)fmt;
The core is aindev_list[]数组, Search for:
static const AVInputFormat * const indev_list[] = {
&ff_alsa_demuxer,
&ff_fbdev_demuxer,
&ff_lavfi_demuxer,
&ff_oss_demuxer,
&ff_sndio_demuxer,
&ff_v4l2_demuxer,
&ff_xcbgrab_demuxer,
NULL };
这样我们就知道了,就这么多AVInputFormat. This is a harvest1
See below for eachAVInputFormat In the specific items and how to get?
This should see the followingprint函数, opts为NULL,fmt Is to get above
print_device_sources(fmt, opts);
fmt 的结构比较复杂,相当于一个类.
type = struct AVInputFormat {
const char *name;
const char *long_name;
int flags;
const char *extensions;
const struct AVCodecTag * const *codec_tag;
const AVClass *priv_class;
const char *mime_type;
struct AVInputFormat *next;
int raw_codec_id;
int priv_data_size;
int (*read_probe)(const AVProbeData *);
int (*read_header)(struct AVFormatContext *);
int (*read_packet)(struct AVFormatContext *, AVPacket *);
int (*read_close)(struct AVFormatContext *);
int (*read_seek)(struct AVFormatContext *, int, int64_t, int);
int64_t (*read_timestamp)(struct AVFormatContext *, int, int64_t *, int64_t);
int (*read_play)(struct AVFormatContext *);
int (*read_pause)(struct AVFormatContext *);
int (*read_seek2)(struct AVFormatContext *, int, int64_t, int64_t, int64_t, int);
int (*get_device_list)(struct AVFormatContext *, struct AVDeviceInfoList *);
int (*create_device_capabilities)(struct AVFormatContext *, struct AVDeviceCapabilitiesQuery *);
int (*free_device_capabilities)(struct AVFormatContext *, struct AVDeviceCapabilitiesQuery *);
}
But the other people all to write,就是上面7种,(Of course related to compile options,You can also add such asdecklink等设备)
Print two parts,Step is to obtain equipment,The second step is to print.
Access to equipment is the key,信息存入device_list
if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) {
printf("Cannot list sources.\n");
goto fail;
}
打印很简单,调用printfJust play.
for (i = 0; i < device_list->nb_devices; i++) {
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
}
device_list 需要讲一下,Because it is stored a lot of information.Data organization is harvest2
AVDeviceInfoList *device_list ;
typedef struct AVDeviceInfoList {
AVDeviceInfo **devices; /**< list of autodetected devices */
int nb_devices; /**< number of autodetected devices */
int default_device; /**< index of default device or -1 if no default */
} AVDeviceInfoList;
2Layer pointer is what?2Layer pointer is a pointer to the table,This form is a pointer table(A layer of pointer),2Pointer solution is a pointer of the quote.
You can also understand3Layer of a pointer is a pointer to a2Layer consisting of pointer table pointer.Reference solution is a2层指针.Of course there is no use,类推一下,Later it is used3层指针.
因为是一个AVDeviceInfo 列表,所以有一个nb_devices
AVDeviceInfo 是如下定义的,name,description
typedef struct AVDeviceInfo {
char *device_name; /**< device name, format depends on device */
char *device_description; /**< human friendly name */
} AVDeviceInfo;
Look at how to obtain equipment list below:
以 ff_alsa_demuxer,为利,Aside from some of its process,直接来到
return ff_alsa_get_device_list(device_list, SND_PCM_STREAM_CAPTURE); //获取CAPTURE 的列表
This function to get todevice 组织到device_list 中,主要流程如下:
if (snd_device_name_hint(-1, "pcm", &hints) < 0) //Get all the card informationhint
return AVERROR_EXTERNAL;
n = hints;
while (*n && !ret) {
name = snd_device_name_get_hint(*n, "NAME");
descr = snd_device_name_get_hint(*n, "DESC");
io = snd_device_name_get_hint(*n, "IOID");
if (!io || !strcmp(io, filter)) {
new_device = av_mallocz(sizeof(AVDeviceInfo)); // 分配内存
new_device->device_name = av_strdup(name);
new_device->device_description = av_strdup(descr);
if ((ret = av_dynarray_add_nofree(&device_list->devices, //加入数组
&device_list->nb_devices, new_device)) < 0) {
goto fail;
}
}
free(io);
free(name);
free(descr);
n++;
}
int snd_device_name_hint(int card, const char *iface, void ***hints);
card==-1, Get all the CARDShint, hints 是3层指针.
char *snd_device_name_get_hint(const void *hint, const char *id);
根据hint和id, Get the name of the corresponding.
These two functions, it is notffmpeg 函数,But the driver provides the function of the. The final data from driving,This is a harvest3
So the data analysis process is finished. 结束.
边栏推荐
- 2022.8.4-----leetcode.1403
- 21 Days Learning Challenge (2) Use of Graphical Device Trees
- CPDA|How Operators Learn Data Analysis (SQL) from Negative Foundations
- word column notes
- 高项 02 信息系统项目管理基础
- Leading the highland of digital medicine, Zhongshan Hospital explores to create a "new paradigm" for future hospitals
- Tencent Cloud [Hiflow] New Era Automation Tool
- Talking about data security governance and privacy computing
- 链表的简单描述及代码的简单实现
- Review 51 MCU
猜你喜欢
链表的简单描述及代码的简单实现
Why did they choose to fall in love with AI?
How Jin Cang database correctness verification platform installation file
通过模拟Vite一起深入其工作原理
.NET应用程序--Helloworld(C#)
ASP.NET应用程序--Hello World
word分栏小记
告白数字化转型时代,时速云镌刻价值新起点
21 Days Learning Challenge (2) Use of Graphical Device Trees
Question about #sql shell#, how to solve it?
随机推荐
word分栏小记
High Item 02 Information System Project Management Fundamentals
In 2022, you still can't "low code"?Data science can also play with Low-Code!
Use SuperMap iDesktopX data migration tool to migrate ArcGIS data
用CH341A烧录外挂Flash (W25Q16JV)
Everyone in China said data, you need to focus on core characteristic is what?
905. 区间选点
YYGH-13-客服中心
冰蝎V4.0攻击来袭,安全狗产品可全面检测
Android实战开发-Kotlin教程(入门篇-登录功能实现 3.3)
运维监控系统之Open-Falcon
剑指Offer--找出数组中重复的数字(三种解法)
Is your data safe in this hyperconnected world?
sql怎么找字段里所有数据为空的字段
Intersection of Boolean Operations in SuperMap iDesktop.Net - Repairing Complex Models with Topological Errors
Beyond YOLO5-Face | YOLO-FaceV2 officially open source Trick+ academic point full
You may use special comments to disable some warnings. Three ways to report errors
Confessing the era of digital transformation, Speed Cloud engraves a new starting point for value
Apache DolphinScheduler, a new generation of distributed workflow task scheduling platform in practice - Medium
语法基础(变量、输入输出、表达式与顺序语句完成情况)