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(目标时间基准)。函数会将ab转换为c

注意事项:

  • 在使用这个函数之前,请确保已经正确设置了AVPacket结构体中的时间戳。
  • 注意检查src_tbdst_tb的值是否合法,否则可能导致转换结果不正确。
posted @ 2024-03-01 14:43  flxx  阅读(56)  评论(0编辑  收藏  举报