1 AVPacket

typedef
struct AVPacket {

/**

* Presentation timestamp in AVStream->time_base units; the time at which

* the decompressed packet will be presented to the user.

* Can be AV_NOPTS_VALUE if it is not stored in the file.

* pts MUST be larger or equal to dts as presentation cannot happen before

* decompression, unless one wants to view hex dumps. Some formats misuse

* the terms dts and pts/cts to mean something different. Such timestamps

* must be converted to true pts/dts before they are stored in AVPacket.

*/

int64_t pts;

/**

* Decompression timestamp in AVStream->time_base units; the time at which

* the packet is decompressed.

* Can be AV_NOPTS_VALUE if it is not stored in the file.

*/

int64_t dts;

uint8_t *data;

int   size;

int   stream_index;

int   flags;

int   duration;

.

.

.

} AVPacket

// AVPacket是个很重要的结构,该结构在读媒体源文件和写输出文件时都需要用到
// int64_t pts; 显示时间戳
// int64_t dts; 解码时间戳
// uint8_t *data; 包数据
// int   size; 包数据长度
// int   stream_index; 包所属流序号
// int   duration; 时长
// 以上信息,如果是在读媒体源文件那么avcodec会初始化,如果是输出文件,用户需要对以上信息赋值
 
2
av_init_packet()

/**

* Initialize optional fields of a packet with default values.

*

* @param pkt packet

*/

void av_init_packet(AVPacket *pkt);

// 使用默认值初始化AVPacket
// 定义AVPacket对象后,请使用av_init_packet进行初始化
 
3
av_free_packet()

/**

* Free a packet.

*

* @param pkt packet to free

*/

void av_free_packet(AVPacket *pkt);

// 释放AVPacket对象
 
4
av_read_frame()

/**

* Return the next frame of a stream.

* This function returns what is stored in the file, and does not validate

* that what is there are valid frames for the decoder. It will split what is

* stored in the file into frames and return one for each call. It will not

* omit invalid data between valid frames so as to give the decoder the maximum

* information possible for decoding.

*

* The returned packet is valid

* until the next av_read_frame() or until av_close_input_file() and

* must be freed with av_free_packet. For video, the packet contains

* exactly one frame. For audio, it contains an integer number of

* frames if each frame has a known fixed size (e.g. PCM or ADPCM

* data). If the audio frames have a variable size (e.g. MPEG audio),

* then it contains one frame.

*

* pkt->pts, pkt->dts and pkt->duration are always set to correct

* values in AVStream.time_base units (and guessed if the format cannot

* provide them). pkt->pts can be AV_NOPTS_VALUE if the video format

* has B-frames, so it is better to rely on pkt->dts if you do not

* decompress the payload.

*

* @return 0 if OK, < 0 on error or end of file

*/

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

// 从输入源文件容器中读取一个AVPacket数据包

// 该函数读出的包并不每次都是有效的,对于读出的包我们都应该进行相应的解码(视频解码/音频解码),

// 在返回值>=0时,循环调用该函数进行读取,循环调用之前请调用av_free_packet函数清理AVPacket
 
5
avcodec_decode_video2()

/**

* Decode the video frame of size avpkt->size from avpkt->data into picture.

* Some decoders may support multiple frames in a single AVPacket, such

* decoders would then just decode the first frame.

*

* @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than

* the actual read bytes because some optimized bitstream readers read 32 or 64

* bits at once and could read over the end.

*

* @warning The end of the input buffer buf should be set to 0 to ensure that

* no overreading happens for damaged MPEG streams.

*

* @note You might have to align the input buffer avpkt->data.

* The alignment requirements depend on the CPU: on some CPUs it isn't

* necessary at all, on others it won't work at all if not aligned and on others

* it will work but it will have an impact on performance.

*

* In practice, avpkt->data should have 4 byte alignment at minimum.

*

* @note Some codecs have a delay between input and output, these need to be

* fed with avpkt->data=NULL, avpkt->size=0 at the end to return the remaining frames.

*

* @param avctx the codec context

* @param[out] picture The AVFrame in which the decoded video frame will be stored.

*             Use avcodec_alloc_frame to get an AVFrame, the codec will

*             allocate memory for the actual bitmap.

*             with default get/release_buffer(), the decoder frees/reuses the bitmap as it sees fit.

*             with overridden get/release_buffer() (needs CODEC_CAP_DR1) the user decides into what buffer the decoder

*                   decodes and the decoder tells the user once it does not need the data anymore,

*                   the user app can at this point free/reuse/keep the memory as it sees fit.

*

* @param[in] avpkt The input AVpacket containing the input buffer.

*            You can create such packet with av_init_packet() and by then setting

*            data and size, some decoders might in addition need other fields like

*            flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least

*            fields possible.

* @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.

* @return On error a negative value is returned, otherwise the number of bytes

* used or zero if no frame could be decompressed.

*/

int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,

int *got_picture_ptr,

AVPacket *avpkt);

// 解码视频流AVPacket
// 使用av_read_frame读取媒体流后需要进行判断,如果为视频流则调用该函数解码
// 返回结果<0时失败,此时程序应该退出检查原因
// 返回>=0时正常,假设 读取包为:AVPacket vPacket 返回值为 int vLen; 每次解码正常时,对vPacket做
// 如下处理:
//   vPacket.size -= vLen;

//   vPacket.data += vLen;
// 如果 vPacket.size==0,则继续读下一流包,否则继续调度该方法进行解码,直到vPacket.size==0
// 返回 got_picture_ptr > 0 时,表示解码到了AVFrame *picture,其后可以对picture进程处理
 
6
avcodec_decode_audio3()

/**

* Decode the audio frame of size avpkt->size from avpkt->data into samples.

* Some decoders may support multiple frames in a single AVPacket, such

* decoders would then just decode the first frame. In this case,

* avcodec_decode_audio3 has to be called again with an AVPacket that contains

* the remaining data in order to decode the second frame etc.

* If no frame

* could be outputted, frame_size_ptr is zero. Otherwise, it is the

* decompressed frame size in bytes.

*

* @warning You must set frame_size_ptr to the allocated size of the

* output buffer before calling avcodec_decode_audio3().

*

* @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than

* the actual read bytes because some optimized bitstream readers read 32 or 64

* bits at once and could read over the end.

*

* @warning The end of the input buffer avpkt->data should be set to 0 to ensure that

* no overreading happens for damaged MPEG streams.

*

* @note You might have to align the input buffer avpkt->data and output buffer

* samples. The alignment requirements depend on the CPU: On some CPUs it isn't

* necessary at all, on others it won't work at all if not aligned and on others

* it will work but it will have an impact on performance.

*

* In practice, avpkt->data should have 4 byte alignment at minimum and

* samples should be 16 byte aligned unless the CPU doesn't need it

* (AltiVec and SSE do).

*

* @param avctx the codec context

* @param[out] samples the output buffer, sample type in avctx->sample_fmt

* @param[in,out] frame_size_ptr the output buffer size in bytes

* @param[in] avpkt The input AVPacket containing the input buffer.

*            You can create such packet with av_init_packet() and by then setting

*            data and size, some decoders might in addition need other fields.

*            All decoders are designed to use the least fields possible though.

* @return On error a negative value is returned, otherwise the number of bytes

* used or zero if no frame data was decompressed (used) from the input AVPacket.

*/

int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,

int *frame_size_ptr,

AVPacket *avpkt);

// 解码音频流AVPacket
// 使用av_read_frame读取媒体流后需要进行判断,如果为音频流则调用该函数解码
// 返回结果<0时失败,此时程序应该退出检查原因
// 返回>=0时正常,假设 读取包为:AVPacket vPacket 返回值为 int vLen; 每次解码正常时,对vPacket做
// 如下处理:
//   vPacket.size -= vLen;

//   vPacket.data += vLen;
// 如果 vPacket.size==0,则继续读下一流包,否则继续调度该方法进行解码,直到vPacket.size==0
//

ffmpeg结构体以及函数介绍(三)的更多相关文章

  1. ffmpeg结构体以及函数介绍(一)

    本文对在使用ffmpeg进行音视频编解码时使用到的一些函数做一个简单介绍,我当前使用的ffmpeg版本为:0.8.5,因为本人发现在不同的版本中,有些函数名称会有点小改动,所以在此有必要说明下ffmp ...

  2. ffmpeg结构体以及函数介绍(二)

    1 avcodec_find_decoder() /** * Find a registered decoder with a matching codec ID. * * @param id Cod ...

  3. FFmpeg 结构体学习(三): AVPacket 分析

    在上文FFmpeg 结构体学习(二): AVStream 分析我们学习了AVStream结构体的相关内容.本文,我们将讲述一下AVPacket. AVPacket是存储压缩编码数据相关信息的结构体.下 ...

  4. FFMPEG结构体分析:AVCodec

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  5. FFMPEG结构体分析:AVFrame

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  6. FFmpeg 结构体学习(五): AVCodec 分析

    在上文FFmpeg 结构体学习(四): AVFrame 分析我们学习了AVFrame结构体的相关内容.本文,我们将讲述一下AVCodec. AVCodec是存储编解码器信息的结构体.下面我们来分析一下 ...

  7. [转载] FFMPEG结构体分析:AVFrame

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  8. FFMPEG结构体分析:AVIOContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  9. FFMPEG结构体分析:AVFormatContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

随机推荐

  1. auto和bool

    一.auto' 1.只要在函数内部定义变量,默认是auto int num 等价于  auto int num = 10; 2.C语言中的auto关键字就是自动分配自动释放 二.bool类型 1.头文 ...

  2. 不干胶打印机 www.bgjdyj.com

    不干胶打印机如何保养 不干胶打印机专卖网根据多年的维修经验总结了以下几种保养不干胶打印机的方法: 1.不干胶打印机打印机标签纸不能搁置太长时间,第一容易起静电.第二容易起灰尘2.不干胶打印机的打印头最 ...

  3. ElasticSearch 6 Windows 安装

    前言 目前使用ElasticSearch 6.2最新版本,这里记录其在windows 2012R2系统上的安装步骤. 安装 1. 安装java,最新版本的ElasticSearch 需要java8 版 ...

  4. python字符串常用的方法解析

    这是本人在学习python过程中总结的一些关于字符串的常用的方法. 文中引用了python3.5版本内置的帮助文档,大致进行翻译,并添加了几个小实验. isalnum S.isalnum() -> ...

  5. php操作mongodb的常用函数

    连接mongodb: $mongoObj = new Mongo("127.0.0.1" , array( 'connect'=>true, 'persist'=>tr ...

  6. Java对正则表达式的支持(二)

    正则表达式的主要用途: a.在目标字符串中找出匹配正则表达式的部分 b.校验目标字符串是否符合正则表达式,例如校验邮箱地址 c.在目标字符串中替换符合正则表达式的部分为其他的字符串 Scanner类是 ...

  7. Redis服务器启动之后3个警告信息的解决方案

    今天是年前最后一篇文章了,不想写太多的东西,就写一些有关Redis相关问题的解决方案.当我们启动了Redis服务器之后,会看到3个警告,如果没看到,那是很好的,但是我看到了.看到了就不能不管,所以就好 ...

  8. ES6 学习笔记之一 块作用域与let和const

    ---恢复内容开始--- 在学习ES6的块作用域和 let.const 之前,我们先来看看ES5以前的 var 关键字. var 关键字用于定义一个变量,通常我们会将其与变量的赋值合并为一条语句,就像 ...

  9. Jmeter_实现操作postgresql数据库

    [环境] ①Jmeter版本:3.2,JDK:1.8: ②postgresql驱动包postgresql-9.3-1103.jdbc4,将该jar包置于..\apache-jmeter-3.2\lib ...

  10. 【css3】旋转倒计时

    很多答题的H5界面上有旋转倒计时的效果,一个不断旋转减少的动画,类似于下图的这样. 今天研究了下,可以通过border旋转得到.一般我们可以通过border得到一个四段圆. See the Pen c ...