• 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;
      
  • 相关阅读:
    故事讲的好,才会有人去思考:什么是成功的商业片——记《疯狂的石头》
    收集的特色flash网站
    pf负载均衡
    squid故障与解决方法汇总
    IIS7.0在Vista上的错误 0x80070021
    PF 默认会限制最大连接数5000问题
    Squid日志详解
    samba结合AD实现大型网络方案
    inotify监听+rsync
    AD帐号登陆samba自动创建主目录脚本
  • 原文地址:https://www.cnblogs.com/fandx/p/12210925.html
Copyright © 2020-2023  润新知