当前位置:网站首页>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. 结束.
边栏推荐
- The usage of try...catch and finally in js
- Use SuperMap iDesktopX data migration tool to migrate map documents and symbols
- Flink 1.15.1 Cluster Construction (StandaloneSession)
- (十一)元类
- leetcode-每日一题1403. 非递增顺序的最小子序列(贪心)
- How to transfer a single node of Youxuan database to a cluster
- ffmpeg -sources分析
- High Item 02 Information System Project Management Fundamentals
- Burp installation and proxy settings
- You may use special comments to disable some warnings. Three ways to report errors
猜你喜欢

用CH341A烧录外挂Flash (W25Q16JV)

如何在WordPress中添加特定类别的小工具

Apache DolphinScheduler, a new generation of distributed workflow task scheduling platform in practice - Medium

Why did they choose to fall in love with AI?

【软件测试】自动化测试之unittest框架

Kubernetes 网络入门

金仓数据库如何验证安装文件平台正确性

人人都在说的数据中台,你需要关注的核心特点是什么?

Step by step how to perform data risk assessment

Is your data safe in this hyperconnected world?
随机推荐
torch.roll()
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
Cybersecurity and the Metaverse: Identifying Weak Links
【软件测试】自动化测试之unittest框架
Hash table lookup (hash table)
Study Notes-----Left-biased Tree
Confessing the era of digital transformation, Speed Cloud engraves a new starting point for value
mysql can't Execute, please solve it
word column notes
How to solve the error cannot update secondary snapshot during a parallel operation when the PostgreSQL database uses navicat to open the table structure?
【七夕节】浪漫七夕,代码传情。将爱意变成绚烂的立体场景,给她(他)一个惊喜!(送代码)
The problem of lack of dynamic library "libtinfo.so.5" in ksql application under UOS system
剑指Offer--找出数组中重复的数字(三种解法)
语法基础(变量、输入输出、表达式与顺序语句)
leetcode - a subtree of another tree
.NET应用程序--Helloworld(C#)
2022-08-04 第六小组 瞒春 学习笔记
沃谈小知识 |“远程透传”那点事儿
Use SuperMap iDesktopX data migration tool to migrate map documents and symbols