ffmpeg中av_find_input_format和avfrormat_open_input函数分析
寻找自己的采集图像设备
av_find_input_format()
根据名称查找链表当中的输入的格式
如果要查找设备在使用之前去调用: avdevice_register_all();
AVInputFormat *av_find_input_format(const char *short_name); /* @param short_name : 指定输入的名称,可以是设备名称avfoundation,或者编码格式:H264, h265... @return: AVInputFormat 结构体看下面 */ typedef struct AVInputFormat { const char *name; // 封装格式名称简写(short_name)[h264] const char *long_name; // 码流输入格式的长名称[raw H.264 video] 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)(AVProbeData *); int (*read_header)(struct AVFormatContext *); int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,int64_t *pos, int64_t pos_limit); int (*read_play)(struct AVFormatContext *); int (*read_pause)(struct AVFormatContext *); int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); } AVInputFormat;
avformat_open_input()
主要用来打开输入流并存储到格式化上下文AVFormatContext中。这个api是不会打开编解码器的
打开的格式化上下文必须要使用:avformat_close_input()来关闭!
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); /* @param ps : 打开之后的数据传入的格式化上线文的指针,失败会自动释放打开的内容 @param url : 要打开的流的URL,可以是设备ID、rtmp、http @param fmt : 输入的格式,如果为空则会自动查找输入的格式 @param options :AVFormatContext和demuxer私有选项的字典。 @return 0: 成功 <0: 失败 */
struct AVFormatContext;
typedef struct AVFormatContext { const AVClass *av_class; struct AVInputFormat *iformat; // 输入容器格式 struct AVOutputFormat *oformat; // 输入容器格式 void *priv_data; // 连接私有数据 AVIOContext *pb; // IO 上下文 int ctx_flags; unsigned int nb_streams; // 流的数量,只能被avformat_new_stream来设置 AVStream **streams; // 文件中所有的流 #if FF_API_FORMAT_FILENAME attribute_deprecated char filename[1024]; // 输入或者输出的文件名 #endif char *url; // 输入或者输出的URL int64_t start_time; //容器的第一帧的时间 int64_t duration; // 流的持续时间 int64_t bit_rate; // 总流的比特率,比特/秒为单位 unsigned int packet_size; int max_delay; int flags; // 修改行为标志 #define AVFMT_FLAG_GENPTS 0x0001 #define AVFMT_FLAG_IGNIDX 0x0002 #define AVFMT_FLAG_NONBLOCK 0x0004 #define AVFMT_FLAG_IGNDTS 0x0008 #define AVFMT_FLAG_NOFILLIN 0x0010 #define AVFMT_FLAG_NOPARSE 0x0020 #define AVFMT_FLAG_NOBUFFER 0x0040 #define AVFMT_FLAG_CUSTOM_IO 0x0080 #define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 #define AVFMT_FLAG_FLUSH_PACKETS 0x0200 #define AVFMT_FLAG_BITEXACT 0x0400 #if FF_API_LAVF_MP4A_LATM #define AVFMT_FLAG_MP4A_LATM 0x8000 #endif #define AVFMT_FLAG_SORT_DTS 0x10000 #define AVFMT_FLAG_PRIV_OPT 0x20000 #if FF_API_LAVF_KEEPSIDE_FLAG #define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 #endif #define AVFMT_FLAG_FAST_SEEK 0x80000 #define AVFMT_FLAG_SHORTEST 0x100000 #define AVFMT_FLAG_AUTO_BSF 0x200000 int64_t probesize; int64_t max_analyze_duration; // 读取数据最大的持续时间 const uint8_t *key; int keylen; unsigned int nb_programs; AVProgram **programs; enum AVCodecID video_codec_id; // 强制在解复用的设置视频解码器的id enum AVCodecID audio_codec_id; // 强制在解复用的设置音频解码器的id enum AVCodecID subtitle_codec_id; // 强制在解复用的时候设置字幕的解码器id unsigned int max_index_size; // 解复用的时候流索引的最大内存 unsigned int max_picture_buffer; // 缓冲帧的最大内存,在实时步骤设备的时候会用到 unsigned int nb_chapters; AVChapter **chapters; AVDictionary *metadata; int64_t start_time_realtime; // 启动的流在现实的时间 int fps_probe_size; // 确定帧率的帧数 int error_recognition; // 错误识别 AVIOInterruptCB interrupt_callback; // IO中断回调 int debug; #define FF_FDEBUG_TS 0x0001 int64_t max_interleave_delta; // 交错的最大缓冲时间 int strict_std_compliance; int event_flags; #define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 int max_ts_probe; int avoid_negative_ts; #define AVFMT_AVOID_NEG_TS_AUTO -1 #define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 #define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 int ts_id; int audio_preload; int max_chunk_duration; int max_chunk_size; int use_wallclock_as_timestamps; int avio_flags; enum AVDurationEstimationMethod duration_estimation_method; int64_t skip_initial_bytes; unsigned int correct_ts_overflow; int seek2any; int flush_packets; int probe_score; int format_probesize; char *codec_whitelist; char *format_whitelist; AVFormatInternal *internal; int io_repositioned; AVCodec *video_codec; AVCodec *audio_codec; AVCodec *subtitle_codec; AVCodec *data_codec; int metadata_header_padding; void *opaque; av_format_control_message control_message_cb; int64_t output_ts_offset; uint8_t *dump_separator; enum AVCodecID data_codec_id; #if FF_API_OLD_OPEN_CALLBACKS attribute_deprecated int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); #endif char *protocol_whitelist; int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url,int flags, AVDictionary **options); // 打开新的IO流进行回调 void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); char *protocol_blacklist; int max_streams; // 最大流的数量 int skip_estimate_duration_from_pts; } AVFormatContext;
相关推荐
zuihaobushi 2020-04-30
xasdfg 2020-04-25
xiaohouye 2020-04-20
往后余生 2020-09-17
CXsilent 2020-09-16
webgm 2020-08-16
Lophole 2020-06-28
sqliang 2020-06-14
xcguoyu 2020-06-13
徐建岗网络管理 2020-06-11
前端开发Kingcean 2020-06-11
cbao 2020-06-10
yezitoo 2020-06-06
bigname 2020-06-04
前端开发Kingcean 2020-05-29
xiaofanguan 2020-05-29