AVFormatContext *ofmt_ctx;
AVStream *out_stream;
AVCodecContext *dec_ctx;
AVCodecContext *enc_ctx;
AVPacket packet;
AVFrame *frame;
avcodec_send_frame(enc_ctx, frame);
avcodec_receive_packet(enc_ctx, packet);
packet.stream_index = out_stream_idx;
enc_ctx->time_base = av_inv_q(dec_ctx->sample_rate);
av_packet_rescale_ts(&opacket, enc_ctx->time_base, out_stream->time_base);
av_interleaved_write_frame(o_fmt_ctx, &packet);
首先介绍下概念:
PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码
也就是pts反映帧什么时候开始显示,dts反映数据流什么时候开始解码
怎么理解这里的“什么时候”呢?如果有某一帧,假设它是第10秒开始显示。那么它的pts是多少呢。是10?还是10s?还是两者都不是。
为了回答这个问题,先引入FFmpeg中时间基的概念,也就是time_
ffmpeg time_base
ffmpeg存在多个时间基准(time_base),对应不同的阶段(结构体),每个time_base具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。搞清楚各个time_base的来源,对于阅读ffmpeg的代码很重要。
一、time_base
1、AVStream(libavformat/avformat.h)
typede
1. I 帧/P 帧/B 帧
I 帧:I 帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在 I 帧图像处可以切换频道,而不会导致图像丢失或无法解码。I 帧图像用于阻止误差的累积和扩散。在闭合式 GOP 中,每个 GOP 的第一个帧一定是 I 帧,且当前 GOP 的数据不会参考前后 GOP 的数据。
P 帧:P 帧(Predictive-coded picture, 预测编码图像帧)是帧间编
Decode Time Stamp(DTS)是解码时间戳,解码器解码时相对于SCR(系统参考)的时间戳。
Presentation Time Stamp(PTS)是渲染时间戳,解码器渲染时相对于SCR(系统参考)的时间戳。
duration是视频时长,表示当前帧的持续时间,或者说两...
ffmpeg存在多个时间基准(time_base),对应不同的阶段(结构体),每个time_base具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。搞清楚各个time_base的来源,对于阅读ffmpeg的代码很重要。
一、time_base
1、 AVStream
AVStream->base_time单位为秒,通过avpriv_set_pts_info(st...
一、time_base
AVStream的time_base的单位是秒。每种格式的time_base的值不一样,根据采样来计算,比如mpeg的pts、dts都是以90kHz来采样的,所以采样间隔就是1/900000秒。
AVCodecContext的time_base单位同样为秒,不过精度没有AVStream->time_base高,大小为1/framerate。
AVPacket下的pts和dts以AVStream->time_base为单位(数值比较大),时间间隔就是AVStream->