PTS и DTS расчет для видео и аудио кадров

Я получаю видео в кодировке H264 и аудио в формате G.711 PCM из двух разных потоков для мультиплексирования / записи в mov мультимедийный контейнер.

Сигнатуры функции записи имеют вид:

bool WriteAudio(const unsigned char *pEncodedData, size_t iLength);
bool WriteVideo(const unsigned char *pEncodedData, size_t iLength, bool const bIFrame);

А функция добавления аудио и видео потоков выглядит так:

AVStream* AudioVideoRecorder::AddMediaStream(enum AVCodecID codecID) {
Log("Adding stream: %s.", avcodec_get_name(codecID));
AVCodecContext* pCodecCtx;
AVStream* pStream;

/* find the encoder */
AVCodec* codec = avcodec_find_encoder(codecID);
if (!codec) {
LogErr("Could not find encoder for %s", avcodec_get_name(codecID));
return NULL;
}

pStream = avformat_new_stream(m_pFormatCtx, codec);
if (!pStream) {
LogErr("Could not allocate stream.");
return NULL;
}
pStream->id = m_pFormatCtx->nb_streams - 1;
pStream->time_base = (AVRational){1, VIDEO_FRAME_RATE};
pCodecCtx = pStream->codec;switch(codec->type) {
case AVMEDIA_TYPE_VIDEO:
pCodecCtx->codec_id = codecID;
pCodecCtx->bit_rate = VIDEO_BIT_RATE;
pCodecCtx->width = PICTURE_WIDTH;
pCodecCtx->height = PICTURE_HEIGHT;
pCodecCtx->gop_size = VIDEO_FRAME_RATE;
pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
m_pVideoStream = pStream;
break;

case AVMEDIA_TYPE_AUDIO:
pCodecCtx->codec_id = codecID;
pCodecCtx->sample_fmt = AV_SAMPLE_FMT_S16;
pCodecCtx->bit_rate = 64000;
pCodecCtx->sample_rate = 8000;
pCodecCtx->channels = 1;
m_pAudioStream = pStream;
break;

default:
break;
}

/* Some formats want stream headers to be separate. */
if (m_pOutputFmt->flags & AVFMT_GLOBALHEADER)
m_pFormatCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;

return pStream;
}

внутри WriteAudio(..) а также WriteVideo(..) функции, я создаю AVPakcet с помощью av_init_packet(...) и установить pEncodedData а также iLength как packet.data а также packet.size, Я напечатал packet.pts а также packet.dts и его эквивалент AV_NOPTS_VALUE,

Теперь, как мне рассчитать PTS, DTS и длительность пакета (packet.dts, packet.pts а также packet.duration) правильно для аудио и видео данных, чтобы я мог синхронизировать аудио & видео и проигрывать его правильно? Я видел много примеров в Интернете, но ни один из них не имеет смысла для меня. Я новичок в ffmpegи моя концепция не может быть правильной в некотором контексте. Я хочу сделать это соответствующим образом.

Заранее спасибо!

РЕДАКТИРОВАТЬ: В моих видеопотоков нет B-кадра. Итак, я думаю, что PTS и DTS могут быть одинаковыми здесь.

3

Решение

PTS / DTS являются временными метками, они должны быть установлены на временные метки входных данных. Я не знаю, откуда взялась ваша дата, но с любым входом связаны какие-то временные метки. Обычно это временные метки входного медиафайла или метрика, полученная из системных часов, если вы записываете со своей звуковой карты + веб-камеры и т. Д. Вы должны преобразовать эти числа в ожидаемую форму, а затем назначить их AVPacket.pts/dts,

2

Другие решения


По вопросам рекламы [email protected]