FFmpeg封装

206 阅读1分钟

流程图

FFmpeg封装.png

注意点

1. h264裸流没有PTS/DTS,需要计算。代码如下:

参数说明:

  • frameIndex:第几帧
  • time_base:时间基
  • AV_TIME_BASE:FFmpeg里默认的时间基值为 1000000

计算公式:

  1. 当时显示时间=PTS * time_base
  2. 当时显示时间=frameIndex / r_frame_rate
  3. PTS * time_base * AV_TIME_BASE = frameIndex * AV_TIME_BASE / r_frame_rate
int64_t calc_duration = AV_TIME_BASE / av_q2d(in_stream->r_frame_rate);
//AV_TIME_BASE单位是us,calc_duration单位也为us,PTS单位是s,所以这里要除以AV_TIME_BASE
pkt->pts = ((double) (frameIndex * calc_duration) /
            (double) (av_q2d(in_stream->time_base) * AV_TIME_BASE));
pkt->dts = pkt->pts;
pkt->duration = ((double) calc_duration / (double) (av_q2d(in_stream->time_base) * AV_TIME_BASE));

2. 读取到的AVPacket到设置stream_index,不然有可能会写错流。

3. 将输出音视频流的时间字段(PTS/DTS/duration等)的时间基从输入流转换成输出流。

项目地址

gitee.com/rong5690001…