当前位置:网站首页>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. 结束.
边栏推荐
- 队列题目:最近的请求次数
- Likou - preorder traversal, inorder traversal, postorder traversal of binary tree
- 毕设-基于SSM房屋租赁管理系统
- Why did they choose to fall in love with AI?
- 21 Days Learning Challenge (2) Use of Graphical Device Trees
- Dameng 8 database export and import
- Multithreading (2)
- 冰蝎V4.0攻击来袭,安全狗产品可全面检测
- QT: The Magical QVarient
- mysql can't Execute, please solve it
猜你喜欢

【七夕节】浪漫七夕,代码传情。将爱意变成绚烂的立体场景,给她(他)一个惊喜!(送代码)

Question about #sql shell#, how to solve it?

QT language file production

After the large pixel panorama is completed, what are the promotion methods?

2022-08-04 The sixth group, hidden from spring, study notes

In 2022, you still can't "low code"?Data science can also play with Low-Code!

word分栏小记
![[Solved] Unity Coroutine coroutine is not executed effectively](/img/ab/035ef004a561fb98d3dd1d7d8b5618.png)
[Solved] Unity Coroutine coroutine is not executed effectively

毕设-基于SSM房屋租赁管理系统

使用二维码传输文件的小工具 - QFileTrans 1.2.0.1
随机推荐
private封装
沃谈小知识 |“远程透传”那点事儿
用CH341A烧录外挂Flash (W25Q16JV)
rpc-remote procedure call demo
AI + Small Nucleic Acid Drugs | Eleven Completes $22 Million Seed Round Financing
You may use special comments to disable some warnings. 报错解决的三种方式
Native js realizes the effect of selecting and canceling all the multi-select boxes
One hundred - day plan -- -- DAY2 brush
Talking about data security governance and privacy computing
语法基础(变量、输入输出、表达式与顺序语句)
Dynamic management of massive service instances
2022 High-level installation, maintenance, and removal of exam questions mock exam question bank and online mock exam
Syntax basics (variables, input and output, expressions and sequential statements)
Distributed systems revisited: there will never be a perfect consistency scheme...
【软件测试】自动化测试之unittest框架
ASP.NET application--Hello World
How to Add Category-Specific Widgets in WordPress
sql怎么找字段里所有数据为空的字段
高项 02 信息系统项目管理基础
人人都在说的数据中台,你需要关注的核心特点是什么?