4.4 AVInputStream/ AVOutputStream 根据输入和输出流的不同,前述的AVStream结构都是封装在AVInputStream和AVOutputStream 结构中,在av_encode( )函数中使用。AVInputStream中还保存的有与时间有关的信息。 AVOutputStream中还保存有与音视频同步等相关的信息。 4.5 AVPacket AVPacket结构定义如下,其是用于保存读取的packet数据。 typedef struct AVPacket { int64_t pts; ///< presentation time stamp in time_base units int64_t dts; ///< decompression time stamp in time_base units uint8_t *data; int size; int stream_index; int flags; int duration; ///< presentation duration in time_base units (0 if not available) void (*destruct)(struct AVPacket *); void *priv; int64_t pos; ///< byte position in stream, -1 if unknown } AVPacket; 在av_encode()函数中,调用AVInputFormat的 (*read_packet)(struct AVFormatContext *, AVPacket *pkt)接口,读取输入文件的一帧数 据保存在当前输入AVFormatContext的AVPacket成员中。 5. av_encode函数主要流程 av_encode()函数是FFMpeg中最重要的函数,编解码和输出等大部分功能都在此函数完成, 因此有必要详细描述一下这个函数的主要流程。 1).input streams initializing 2).output streams initializing 3).encoders and decoders initializing 4).set meta data information from input file if required. 5).write output files header 6).loop of handling each frame a.read frame from input file: b.decode frame data c.encode new frame data d.write new frame to output file 7).write output files trailer 8).close each encoder and decoder