zoukankan      html  css  js  c++  java
  • 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;
      
  • 相关阅读:
    [置顶] windows player,wzplayerV2 for windows
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    编译cegcc 0.59.1
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    windows player,wzplayerV2 for windows(20140416)更新
    编译cegcc 0.59.1
  • 原文地址:https://www.cnblogs.com/fandx/p/12210925.html
Copyright © 2011-2022 走看看