При создании пользовательского закодированного видео с помощью FFMpeg вам фактически потребуется установить PTS для каждого AVPacket, который записывается в выходной файл.Установка time_base вашего AVCodecContext только скажет контейнеру, чего ожидать.PTS (отметка времени презентации) сообщает декодеру (при просмотре видео), когда на самом деле отображать этот конкретный кадр.
Например:
У меня есть AVFrame, который я получил от V4L2часть FFMpeg.Для начала безопаснее сделать копию этого изображения с помощью av_picture_copy.(Таким образом, кодировщик не просматривает всю дополнительную информацию в структуре AVFrame.)
av_picture_copy( (AVPicture*) picture, (AVPicture*) pFrame, c->pix_fmt, c->width, c->height );
picture->pts = numFrames;
теперь задает количество точек на основе количества кодированных кадров
pDestFrame->pts = numFrames;
теперь кодирует
numEncodedBytes = avcodec_encode_video( AVCodecCtx, buffer, bufferSize, pDestFrame );
СЕЙЧАС Создайте AVPacket и снова установите метку времени после перемасштабирования
AVPacket pkt;
av_init_packet(&pkt);
pkt.pts = av_rescale_q( c->coded_frame->pts, c->time_base, mpVideoStr->time_base );
if ( c->coded_frame->key_frame ) pkt.flags |= AV_PKT_FLAG_KEY;
pkt.stream_index = mpVideoStr->index;
pkt.data = outbuf;
pkt.size = out_size;
Наконец, вы можете записать пакет
av_write_frame( formatCtx, &pkt );
Я знаю, что это работает дляКодирование видео H264, но я не уверен на 100%, что оно работает для других типов видео, так как я писал о H264, только когда писал это.