我是靠谱客的博主 无私牛排,这篇文章主要介绍ffmpeg 基本数据结构和对象(二): muxer/demuxer 和 encoder/decoder,现在分享给大家,希望可以做个参考。

一、

muxer(封装器) 和 demuxer(解封装器)存放在 libavformat 目录下的mux.c 文件中;

1、封装器 muxer 

muxer 提供的接口有:

int avformat_write_header(AVFormatContext *s, AVDictionary **options)
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
static int write_packet(AVFormatContext *s, AVPacket *pkt)
int av_write_trailer(AVFormatContext *s)



从API也可以看出封装器的工作主要就是写数据文件的头和尾以及数据帧

2、封装器实现对应的数据结构是: AVIputFormat

typedef struct AVInputFormat {
/**
* A comma separated list of short names for the format. New names
* may be appended with a minor bump.
*/
const char *name;
/**
* Descriptive name for the format, meant to be more human-readable
* than name. You should use the NULL_IF_CONFIG_SMALL() macro
* to define it.
*/
const char *long_name;
int flags;
/**
* If extensions are defined, then no probe is done. You should
* usually not use extension format guessing because it is not
* reliable enough
*/
const char *extensions;
const struct AVCodecTag * const *codec_tag;
const AVClass *priv_class; ///< AVClass for the private context
/*****************************************************************
* No fields below this line are part of the public API. They
* may not be used outside of libavformat and can be changed and
* removed at will.
* New public fields should be added right above.
*****************************************************************
*/
struct AVInputFormat *next;
/**
* Raw demuxers store their codec ID here.
*/
int raw_codec_id;
/**
* Size of private data so that it can be allocated in the wrapper.
*/
int priv_data_size;
/**
* Tell if a given file has a chance of being parsed as this format.
* The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes
* big so you do not have to check for that unless you need more.
*/
int (*read_probe)(AVProbeData *);
/**
* Read the format header and initialize the AVFormatContext
* structure. Return 0 if OK. Only used in raw format right
* now. 'avformat_new_stream' should be called to create new streams.
*/
int (*read_header)(struct AVFormatContext *);
/**
* Read one packet and put it in 'pkt'. pts and flags are also
* set. 'avformat_new_stream' can be called only if the flag
* AVFMTCTX_NOHEADER is used and only in the calling thread (not in a
* background thread).
* @return 0 on success, < 0 on error.
*
When returning an error, pkt must not have been allocated
*
or must be freed before returning
*/
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
/**
* Close the stream. The AVFormatContext and AVStreams are not
* freed by this function
*/
int (*read_close)(struct AVFormatContext *);
/**
* Seek to a given timestamp relative to the frames in
* stream component stream_index.
* @param stream_index Must not be -1.
* @param flags Selects which direction should be preferred if no exact
*
match is available.
* @return >= 0 on success (but not necessarily the new offset)
*/
int (*read_seek)(struct AVFormatContext *,
int stream_index, int64_t timestamp, int flags);
/**
* Get the next timestamp in stream[stream_index].time_base units.
* @return the timestamp or AV_NOPTS_VALUE if an error occurred
*/
int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
int64_t *pos, int64_t pos_limit);
/**
* Start/resume playing - only meaningful if using a network-based format
* (RTSP).
*/
int (*read_play)(struct AVFormatContext *);
/**
* Pause playing - only meaningful if using a network-based format
* (RTSP).
*/
int (*read_pause)(struct AVFormatContext *);
/**
* Seek to timestamp ts.
* Seeking will be done so that the point from which all active streams
* can be presented successfully will be closest to ts and within min/max_ts.
* Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.
*/
int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
} AVInputFormat;


不同格式的视频文件会对应不同的封装器,这就需要有封装器的多个实现。而在ffmpeg中,所有的封装器都继承自AVInputFormat结构,并实现AVInputFormat中定义的函数指针(虚函数):具体整理如下

int (*read_probe)(AVProbeData *);

int (*read_header)(struct AVFormatContext *, AVFormatParameters *ap);

int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);

int (*read_close)(struct AVFormatContext *);

int (*read_seek)(struct AVFormatContext *, int stream_index, int64_t timestamp, int flags);



二、解封装器 demuxer

解封装器存在于文件 libavformat/dxa.c 文件中

在这里面主要定义了如下接口:




最后

以上就是无私牛排最近收集整理的关于ffmpeg 基本数据结构和对象(二): muxer/demuxer 和 encoder/decoder的全部内容,更多相关ffmpeg内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部