av_packet_rescale_ts
/**
* Convert valid timing fields (timestamps / durations) in a packet from one
* timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
* ignored.
*
* @param pkt packet on which the conversion will be performed
* @param src_tb source timebase, in which the timing fields in pkt are
* expressed
* @param dst_tb destination timebase, to which the timing fields will be
* converted
*/
void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
{
if (pkt->pts != AV_NOPTS_VALUE)
pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb);
if (pkt->dts != AV_NOPTS_VALUE)
pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb);
if (pkt->duration > 0)
pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb);
}
av_packet_rescale_ts用于调整AVPacket结构体中时间戳(timestamp)的单位。AVPacket结构体通常用于存储音频或视频流中的数据包。
参数说明:
pkt:指向AVPacket结构体的指针。src_tb:源时间基准。这是一个AVRational结构体,用于表示原始时间戳的单位。dst_tb:目标时间基准。这是一个AVRational结构体,用于表示调整后时间戳的单位。
函数实现原理:
首先,函数会检查AVPacket结构体中的pts(显示时间戳)、dts(解码时间戳)和duration(持续时间)是否为AV_NOPTS_VALUE,如果不是,则对这些时间戳进行调整。
av_rescale_q是一个用于调整时间戳的函数,它接受三个参数:a(原始时间戳)、b(原始时间基准)和c(目标时间基准)。函数会将a从b转换为c。
注意事项:
- 在使用这个函数之前,请确保已经正确设置了AVPacket结构体中的时间戳。
- 注意检查
src_tb和dst_tb的值是否合法,否则可能导致转换结果不正确。
本文来自博客园,作者:flxx,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/18047037
浙公网安备 33010602011771号