FFmpeg基礎一

來源:http://blog.csdn.net/chance_yin/article/details/10323441php

 

1、研究數字多媒體,首先要了解幾個基本術語(ffmpeg的相關文檔幾乎都是英文的,不弄懂幾個基本術語看文檔仍是比較吃力的)java

  一、容器/文件 (Container/file) ,既多媒體源文件git

  二、媒體流(Stream):與時間相關的一段連續數據。既某一時刻對應某個數據,這樣的多個連續數據組在一塊兒就成了媒體流。數組

  三、數據幀/數據包(Frame/Packet):一個媒體流由大量的數據幀構成。數據幀也是編解碼器最小的處理單元。數據結構


2、FFmpeg 基礎---FFmpeg中重要的幾個數據結構app


  一、AVCodecContext,這是一個描述編解碼器上下文的數據結構,包含了衆多編解碼器須要的參數信息less

  

  1. typedef struct AVCodecContext {  
  2.    
  3.     ......  
  4.    
  5.     /** 
  6.      * some codecs need / can use extradata like Huffman tables. 
  7.      * mjpeg: Huffman tables 
  8.      * rv10: additional flags 
  9.      * mpeg4: global headers (they can be in the bitstream or here) 
  10.      * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger 
  11.      * than extradata_size to avoid prolems if it is read with the bitstream reader. 
  12.      * The bytewise contents of extradata must not depend on the architecture or CPU endianness. 
  13.      * - encoding: Set/allocated/freed by libavcodec. 
  14.      * - decoding: Set/allocated/freed by user. 
  15.      */  
  16.     uint8_t *extradata;  
  17.     int extradata_size;  
  18.     /** 
  19.      * This is the fundamental unit of time (in seconds) in terms 
  20.      * of which frame timestamps are represented. For fixed-fps content, 
  21.      * timebase should be 1/framerate and timestamp increments should be 
  22.      * identically 1. 
  23.      * - encoding: MUST be set by user. 
  24.      * - decoding: Set by libavcodec. 
  25.      */  
  26.     AVRational time_base;  
  27.    
  28.     /* video only */  
  29.     /** 
  30.      * picture width / height. 
  31.      * - encoding: MUST be set by user. 
  32.      * - decoding: Set by libavcodec. 
  33.      * Note: For compatibility it is possible to set this instead of 
  34.      * coded_width/height before decoding. 
  35.      */  
  36.     int width, height;  
  37.    
  38.     ......  
  39.    
  40.     /* audio only */  
  41.     int sample_rate; ///< samples per second  
  42.     int channels;    ///< number of audio channels  
  43.    
  44.     /** 
  45.      * audio sample format 
  46.      * - encoding: Set by user. 
  47.      * - decoding: Set by libavcodec. 
  48.      */  
  49.     enum SampleFormat sample_fmt;  ///< sample format  
  50.    
  51.     /* The following data should not be initialized. */  
  52.     /** 
  53.      * Samples per packet, initialized when calling 'init'. 
  54.      */  
  55.     int frame_size;  
  56.     int frame_number;   ///< audio or video frame number  
  57.    
  58.     ......  
  59.    
  60.     char codec_name[32];  
  61.     enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */  
  62.     enum CodecID codec_id; /* see CODEC_ID_xxx */  
  63.    
  64.     /** 
  65.      * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). 
  66.      * This is used to work around some encoder bugs. 
  67.      * A demuxer should set this to what is stored in the field used to identify the codec. 
  68.      * If there are multiple such fields in a container then the demuxer should choose the one 
  69.      * which maximizes the information about the used codec. 
  70.      * If the codec tag field in a container is larger then 32 bits then the demuxer should 
  71.      * remap the longer ID to 32 bits with a table or other structure. Alternatively a new 
  72.      * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated 
  73.      * first. 
  74.      * - encoding: Set by user, if not then the default based on codec_id will be used. 
  75.      * - decoding: Set by user, will be converted to uppercase by libavcodec during init. 
  76.      */  
  77.     unsigned int codec_tag;              
  78.    
  79.     ......  
  80.    
  81.     /** 
  82.      * Size of the frame reordering buffer in the decoder. 
  83.      * For MPEG-2 it is 1 IPB or 0 low delay IP. 
  84.      * - encoding: Set by libavcodec. 
  85.      * - decoding: Set by libavcodec. 
  86.      */  
  87.     int has_b_frames;  
  88.    
  89.     /** 
  90.      * number of bytes per packet if constant and known or 0 
  91.      * Used by some WAV based audio codecs. 
  92.      */  
  93.     int block_align;  
  94.    
  95.     ......  
  96.    
  97.     /** 
  98.      * bits per sample/pixel from the demuxer (needed for huffyuv). 
  99.      * - encoding: Set by libavcodec. 
  100.      * - decoding: Set by user. 
  101.      */  
  102.      int bits_per_coded_sample;    
  103.    
  104.      ......  
  105.    
  106. } AVCodecContext;  

 

若是是單純使用libavcodec,這部分信息須要調用者進行初始化;若是是使用整個FFMPEG庫,這部分信息在調用 avformat_open_input和avformat_find_stream_info的過程當中根據文件的頭信息及媒體流內的頭部信息完成初始 化。其中幾個主要域的釋義以下:ide

  1. extradata/extradata_size: 這個buffer中存放了解碼器可能會用到的額外信息,在av_read_frame中填充。通常來講,首先,某種具體格式的demuxer在讀取格式頭 信息的時候會填充extradata,其次,若是demuxer沒有作這個事情,好比可能在頭部壓根兒就沒有相關的編解碼信息,則相應的parser會繼 續從已經解複用出來的媒體流中繼續尋找。在沒有找到任何額外信息的狀況下,這個buffer指針爲空。
  2. time_base:編解碼器的時間基準,實際上就是視頻的幀率(或場率)。
  3. width/height:視頻的寬和高。
  4. sample_rate/channels:音頻的採樣率和信道數目。
  5. sample_fmt: 音頻的原始採樣格式。
  6. codec_name/codec_type/codec_id/codec_tag:編解碼器的信息。

  二、AVStream  該結構體描述一個媒體流函數

  

  1. typedef struct AVStream {  
  2.     int index;    /**< stream index in AVFormatContext */  
  3.     int id;       /**< format-specific stream ID */  
  4.     AVCodecContext *codec; /**< codec context */  
  5.     /** 
  6.      * Real base framerate of the stream. 
  7.      * This is the lowest framerate with which all timestamps can be 
  8.      * represented accurately (it is the least common multiple of all 
  9.      * framerates in the stream). Note, this value is just a guess! 
  10.      * For example, if the time base is 1/90000 and all frames have either 
  11.      * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. 
  12.      */  
  13.     AVRational r_frame_rate;  
  14.    
  15.     ......  
  16.    
  17.     /** 
  18.      * This is the fundamental unit of time (in seconds) in terms 
  19.      * of which frame timestamps are represented. For fixed-fps content, 
  20.      * time base should be 1/framerate and timestamp increments should be 1. 
  21.      */  
  22.     AVRational time_base;  
  23.    
  24.     ......  
  25.    
  26.     /** 
  27.      * Decoding: pts of the first frame of the stream, in stream time base. 
  28.      * Only set this if you are absolutely 100% sure that the value you set 
  29.      * it to really is the pts of the first frame. 
  30.      * This may be undefined (AV_NOPTS_VALUE). 
  31.      * @note The ASF header does NOT contain a correct start_time the ASF 
  32.      * demuxer must NOT set this. 
  33.      */  
  34.     int64_t start_time;  
  35.     /** 
  36.      * Decoding: duration of the stream, in stream time base. 
  37.      * If a source file does not specify a duration, but does specify 
  38.      * a bitrate, this value will be estimated from bitrate and file size. 
  39.      */  
  40.     int64_t duration;  
  41.    
  42. #if LIBAVFORMAT_VERSION_INT < (53<<16)  
  43.     char language[4]; /** ISO 639-2/B 3-letter language code (empty string if undefined) */  
  44. #endif  
  45.    
  46.     /* av_read_frame() support */  
  47.     enum AVStreamParseType need_parsing;  
  48.     struct AVCodecParserContext *parser;  
  49.    
  50.     ......  
  51.    
  52.     /* av_seek_frame() support */  
  53.     AVIndexEntry *index_entries; /**< Only used if the format does not 
  54.                                     support seeking natively. */  
  55.     int nb_index_entries;  
  56.     unsigned int index_entries_allocated_size;  
  57.    
  58.     int64_t nb_frames;                 ///< number of frames in this stream if known or 0  
  59.    
  60.     ......  
  61.    
  62.     /** 
  63.      * Average framerate 
  64.      */  
  65.     AVRational avg_frame_rate;  
  66.     ......  
  67. } AVStream;  

主要域的釋義以下,其中大部分域的值能夠由avformat_open_input根據文件頭的信息肯定,缺乏的信息須要經過調用avformat_find_stream_info讀幀及軟解碼進一步獲取:oop

  1. index/id:index對應流的索引,這個數字是自動生成的,根據index能夠從AVFormatContext::streams表中索引到該流;而id則是流的標識,依賴於具體的容器格式。好比對於MPEG TS格式,id就是pid。
  2. time_base:流的時間基準,是一個實數,該流中媒體數據的pts和dts都將以這個時間基準爲粒度。一般,使用av_rescale/av_rescale_q能夠實現不一樣時間基準的轉換。
  3. start_time:流的起始時間,以流的時間基準爲單位,一般是該流中第一個幀的pts。
  4. duration:流的總時間,以流的時間基準爲單位。
  5. need_parsing:對該流parsing過程的控制域。
  6. nb_frames:流內的幀數目。
  7. r_frame_rate/framerate/avg_frame_rate:幀率相關。
  8. codec:指向該流對應的AVCodecContext結構,調用avformat_open_input時生成。
  9. parser:指向該流對應的AVCodecParserContext結構,調用avformat_find_stream_info時生成。

三、AVFormatContext,這個結構體描述了一個媒體文件或媒體流的構成和基本信息

  

[java] view plain copy
  1. typedef struct AVFormatContext {  
  2.     const AVClass *av_class; /**< Set by avformat_alloc_context. */  
  3.     /* Can only be iformat or oformat, not both at the same time. */  
  4.     struct AVInputFormat *iformat;  
  5.     struct AVOutputFormat *oformat;  
  6.     void *priv_data;  
  7.     ByteIOContext *pb;  
  8.     unsigned int nb_streams;  
  9.     AVStream *streams[MAX_STREAMS];  
  10.     char filename[1024]; /**< input or output filename */  
  11.     /* stream info */  
  12.     int64_t timestamp;  
  13. #if LIBAVFORMAT_VERSION_INT < (53<<16)  
  14.     char title[512];  
  15.     char author[512];  
  16.     char copyright[512];  
  17.     char comment[512];  
  18.     char album[512];  
  19.     int year;  /**< ID3 year, 0 if none */  
  20.     int track; /**< track number, 0 if none */  
  21.     char genre[32]; /**< ID3 genre */  
  22. #endif  
  23.    
  24.     int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */  
  25.     /* private data for pts handling (do not modify directly). */  
  26.     /** This buffer is only needed when packets were already buffered but 
  27.        not decoded, for example to get the codec parameters in MPEG 
  28.        streams. */  
  29.     struct AVPacketList *packet_buffer;  
  30.    
  31.     /** Decoding: position of the first frame of the component, in 
  32.        AV_TIME_BASE fractional seconds. NEVER set this value directly: 
  33.        It is deduced from the AVStream values.  */  
  34.     int64_t start_time;  
  35.     /** Decoding: duration of the stream, in AV_TIME_BASE fractional 
  36.        seconds. Only set this value if you know none of the individual stream 
  37.        durations and also dont set any of them. This is deduced from the 
  38.        AVStream values if not set.  */  
  39.     int64_t duration;  
  40.     /** decoding: total file size, 0 if unknown */  
  41.     int64_t file_size;  
  42.     /** Decoding: total stream bitrate in bit/s, 0 if not 
  43.        available. Never set it directly if the file_size and the 
  44.        duration are known as FFmpeg can compute it automatically. */  
  45.     int bit_rate;  
  46.    
  47.     /* av_read_frame() support */  
  48.     AVStream *cur_st;  
  49. #if LIBAVFORMAT_VERSION_INT < (53<<16)  
  50.     const uint8_t *cur_ptr_deprecated;  
  51.     int cur_len_deprecated;  
  52.     AVPacket cur_pkt_deprecated;  
  53. #endif  
  54.    
  55.     /* av_seek_frame() support */  
  56.     int64_t data_offset; /** offset of the first packet */  
  57.     int index_built;  
  58.    
  59.     int mux_rate;  
  60.     unsigned int packet_size;  
  61.     int preload;  
  62.     int max_delay;  
  63.    
  64. #define AVFMT_NOOUTPUTLOOP -1  
  65. #define AVFMT_INFINITEOUTPUTLOOP 0  
  66.     /** number of times to loop output in formats that support it */  
  67.     int loop_output;  
  68.    
  69.     int flags;  
  70. #define AVFMT_FLAG_GENPTS       0x0001 ///< Generate missing pts even if it requires parsing future frames.  
  71. #define AVFMT_FLAG_IGNIDX       0x0002 ///< Ignore index.  
  72. #define AVFMT_FLAG_NONBLOCK     0x0004 ///< Do not block when reading packets from input.  
  73. #define AVFMT_FLAG_IGNDTS       0x0008 ///< Ignore DTS on frames that contain both DTS & PTS  
  74. #define AVFMT_FLAG_NOFILLIN     0x0010 ///< Do not infer any values from other values, just return what is stored in the container  
  75. #define AVFMT_FLAG_NOPARSE      0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled  
  76. #define AVFMT_FLAG_RTP_HINT     0x0040 ///< Add RTP hinting to the output file  
  77.    
  78.     int loop_input;  
  79.     /** decoding: size of data to probe; encoding: unused. */  
  80.     unsigned int probesize;  
  81.    
  82.     /** 
  83.      * Maximum time (in AV_TIME_BASE units) during which the input should 
  84.      * be analyzed in avformat_find_stream_info(). 
  85.      */  
  86.     int max_analyze_duration;  
  87.    
  88.     const uint8_t *key;  
  89.     int keylen;  
  90.    
  91.     unsigned int nb_programs;  
  92.     AVProgram **programs;  
  93.    
  94.     /** 
  95.      * Forced video codec_id. 
  96.      * Demuxing: Set by user. 
  97.      */  
  98.     enum CodecID video_codec_id;  
  99.     /** 
  100.      * Forced audio codec_id. 
  101.      * Demuxing: Set by user. 
  102.      */  
  103.     enum CodecID audio_codec_id;  
  104.     /** 
  105.      * Forced subtitle codec_id. 
  106.      * Demuxing: Set by user. 
  107.      */  
  108.     enum CodecID subtitle_codec_id;  
  109.    
  110.     /** 
  111.      * Maximum amount of memory in bytes to use for the index of each stream. 
  112.      * If the index exceeds this size, entries will be discarded as 
  113.      * needed to maintain a smaller size. This can lead to slower or less 
  114.      * accurate seeking (depends on demuxer). 
  115.      * Demuxers for which a full in-memory index is mandatory will ignore 
  116.      * this. 
  117.      * muxing  : unused 
  118.      * demuxing: set by user 
  119.      */  
  120.     unsigned int max_index_size;  
  121.    
  122.     /** 
  123.      * Maximum amount of memory in bytes to use for buffering frames 
  124.      * obtained from realtime capture devices. 
  125.      */  
  126.     unsigned int max_picture_buffer;  
  127.    
  128.     unsigned int nb_chapters;  
  129.     AVChapter **chapters;  
  130.    
  131.     /** 
  132.      * Flags to enable debugging. 
  133.      */  
  134.     int debug;  
  135. #define FF_FDEBUG_TS        0x0001  
  136.    
  137.     /** 
  138.      * Raw packets from the demuxer, prior to parsing and decoding. 
  139.      * This buffer is used for buffering packets until the codec can 
  140.      * be identified, as parsing cannot be done without knowing the 
  141.      * codec. 
  142.      */  
  143.     struct AVPacketList *raw_packet_buffer;  
  144.     struct AVPacketList *raw_packet_buffer_end;  
  145.    
  146.     struct AVPacketList *packet_buffer_end;  
  147.    
  148.     AVMetadata *metadata;  
  149.    
  150.     /** 
  151.      * Remaining size available for raw_packet_buffer, in bytes. 
  152.      * NOT PART OF PUBLIC API 
  153.      */  
  154. #define RAW_PACKET_BUFFER_SIZE 2500000  
  155.     int raw_packet_buffer_remaining_size;  
  156.    
  157.     /** 
  158.      * Start time of the stream in real world time, in microseconds 
  159.      * since the unix epoch (00:00 1st January 1970). That is, pts=0 
  160.      * in the stream was captured at this real world time. 
  161.      * - encoding: Set by user. 
  162.      * - decoding: Unused. 
  163.      */  
  164.     int64_t start_time_realtime;  
  165. } AVFormatContext;  

這是FFMpeg中最爲基本的一個結構,是其餘全部結構的根,是一個多媒體文件或流的根本抽象。其中:

  • nb_streams和streams所表示的AVStream結構指針數組包含了全部內嵌媒體流的描述;
  • iformat和oformat指向對應的demuxer和muxer指針;
  • pb則指向一個控制底層數據讀寫的ByteIOContext結構。
  • start_time和duration是從streams數組的各個AVStream中推斷出的多媒體文件的起始時間和長度,以微妙爲單位。

一般,這個結構由avformat_open_input在內部建立並以缺省值初始化部分紅員。可是,若是調用者但願本身建立該結構,則須要顯式爲該結構的一些成員置缺省值——若是沒有缺省值的話,會致使以後的動做產生異常。如下成員須要被關注:

  • probesize
  • mux_rate
  • packet_size
  • flags
  • max_analyze_duration
  • key
  • max_index_size
  • max_picture_buffer
  • max_delay

四、AVPacket

  1. typedef struct AVPacket {  
  2.     /** 
  3.      * Presentation timestamp in AVStream->time_base units; the time at which 
  4.      * the decompressed packet will be presented to the user. 
  5.      * Can be AV_NOPTS_VALUE if it is not stored in the file. 
  6.      * pts MUST be larger or equal to dts as presentation cannot happen before 
  7.      * decompression, unless one wants to view hex dumps. Some formats misuse 
  8.      * the terms dts and pts/cts to mean something different. Such timestamps 
  9.      * must be converted to true pts/dts before they are stored in AVPacket. 
  10.      */  
  11.     int64_t pts;  
  12.     /** 
  13.      * Decompression timestamp in AVStream->time_base units; the time at which 
  14.      * the packet is decompressed. 
  15.      * Can be AV_NOPTS_VALUE if it is not stored in the file. 
  16.      */  
  17.     int64_t dts;  
  18.     uint8_t *data;  
  19.     int   size;  
  20.     int   stream_index;  
  21.     int   flags;  
  22.     /** 
  23.      * Duration of this packet in AVStream->time_base units, 0 if unknown. 
  24.      * Equals next_pts - this_pts in presentation order. 
  25.      */  
  26.     int   duration;  
  27.     void  (*destruct)(struct AVPacket *);  
  28.     void  *priv;  
  29.     int64_t pos;                            ///< byte position in stream, -1 if unknown  
  30.    
  31.     /** 
  32.      * Time difference in AVStream->time_base units from the pts of this 
  33.      * packet to the point at which the output from the decoder has converged 
  34.      * independent from the availability of previous frames. That is, the 
  35.      * frames are virtually identical no matter if decoding started from 
  36.      * the very first frame or from this keyframe. 
  37.      * Is AV_NOPTS_VALUE if unknown. 
  38.      * This field is not the display duration of the current packet. 
  39.      * 
  40.      * The purpose of this field is to allow seeking in streams that have no 
  41.      * keyframes in the conventional sense. It corresponds to the 
  42.      * recovery point SEI in H.264 and match_time_delta in NUT. It is also 
  43.      * essential for some types of subtitle streams to ensure that all 
  44.      * subtitles are correctly displayed after seeking. 
  45.      */  
  46.     int64_t convergence_duration;  
  47. } AVPacket;  


FFMPEG使用AVPacket來暫存媒體數據包及附加信息(解碼時間戳、顯示時間戳、時長等),這樣的媒體數據包所承載的每每不是原始格式的音視頻數據,而是以某種方式編碼後的數據,編碼信息由對應的媒體流結構AVStream給出。AVPacket包含如下數據域:

  • dts表示解碼時間戳,pts表示顯示時間戳,它們的單位是所屬媒體流的時間基準。
  • stream_index給出所屬媒體流的索引;
  • data爲數據緩衝區指針,size爲長度;
  • duration爲數據的時長,也是以所屬媒體流的時間基準爲單位;
  • pos表示該數據在媒體流中的字節偏移量;
  • destruct爲用於釋放數據緩衝區的函數指針;
  • flags爲標誌域,其中,最低爲置1表示該數據是一個關鍵幀。

AVPacket結構自己只是個容器,它使用data成員引用實際的數據緩衝區。這個緩衝區的管理方式有兩種,其一是經過調用av_new_packet 直接建立緩衝區,其二是引用已經存在的緩衝區。緩衝區的釋放經過調用av_free_packet實現,其內部實現也採用了兩種不一樣的釋放方式,第一種方 式是調用AVPacket的destruct函數,這個destruct函數多是缺省的av_destruct_packet,對應 av_new_packet或av_dup_packet建立的緩衝區,也多是某個自定義的釋放函數,表示緩衝區的提供者但願使用者在結束緩衝區的時候 按照提供者指望的方式將其釋放,第二種方式是僅僅將data和size的值清0,這種狀況下每每是引用了一個已經存在的緩衝區,AVPacket的 destruct指針爲空。

在使用AVPacket時,對於緩衝區的提供者,必須注意經過設置destruct函數指針指定正確的釋放方式,若是緩衝區提供者打算本身釋放緩衝區,則 切記將destruct置空;而對於緩衝區的使用者,務必在使用結束時調用av_free_packet釋放緩衝區(雖然釋放操做可能只是一個假動做)。 若是某個使用者打算較長時間內佔用一個AVPacket——好比不打算在函數返回以前釋放它——最好調用av_dup_packet進行緩衝區的克隆,將 其轉化爲自有分配的緩衝區,以避免對緩衝區的不當佔用形成異常錯誤。av_dup_packet會爲destruct指針爲空的AVPacket新建一個緩 衝區,而後將原緩衝區的數據拷貝至新緩衝區,置data的值爲新緩衝區的地址,同時設destruct指針爲av_destruct_packet。

3、時間信息 /  多媒體同步

 

時間信息用於實現多媒體同步。

同步的目的在於展現多媒體信息時,可以保持媒體對象之間固有的時間關係。同步有兩類,一類是流內同步,其主要任務是保證單個媒體流內的時間關係,以知足感 知要求,如按照規定的幀率播放一段視頻;另外一類是流間同步,主要任務是保證不一樣媒體流之間的時間關係,如音頻和視頻之間的關係(lipsync)。

對於固定速率的媒體,如固定幀率的視頻或固定比特率的音頻,能夠將時間信息(幀率或比特率)置於文件首部(header),如AVI的hdrl List、MP4的moov box,還有一種相對複雜的方案是將時間信息嵌入媒體流的內部,如MPEG TS和Real video,這種方案能夠處理變速率的媒體,亦可有效避免同步過程當中的時間漂移。

FFMPEG會爲每個數據包打上時間標籤,以更有效地支持上層應用的同步機制。時間標籤有兩種,一種是DTS,稱爲解碼時間標籤,另外一種是PTS,稱爲 顯示時間標籤。對於聲音來講 ,這兩個時間標籤是相同的,但對於某些視頻編碼格式,因爲採用了雙向預測技術,會形成DTS和PTS的不一致。

 

無雙向預測幀的狀況:

圖像類型: I   P   P   P   P   P   P ...  I   P   P
DTS:     0   1   2   3   4   5   6...  100 101 102
PTS:     0   1   2   3   4   5   6...  100 101 102

有雙向預測幀的狀況:

圖像類型: I   P   B   B   P   B   B ...  I   P   B
DTS:     0   1   2   3   4   5   6 ...  100 101 102
PTS:     0   3   1   2   6   4   5 ...  100 104 102

對於存在雙向預測幀的狀況,一般要求解碼器對圖像重排序,以保證輸出的圖像順序爲顯示順序:

解碼器輸入:I   P   B   B   P   B   B
 (DTS)     0   1   2   3   4   5   6  
 (PTS)     0   3   1   2   6   4   5
解碼器輸出:X   I   B   B   P   B   B   P
 (PTS)     X   0   1   2   3   4   5   6

時間信息的獲取:

經過調用avformat_find_stream_info,多媒體應用能夠從AVFormatContext對象中拿到媒體文件的時間信息:主要是總 時間長度和開始時間,此外還有與時間信息相關的比特率和文件大小。其中時間信息的單位是AV_TIME_BASE:微秒。

相關文章
相關標籤/搜索