gpt4 book ai didi

c++ - 视频和音频帧的 PTS 和 DTS 计算

转载 作者:太空狗 更新时间:2023-10-29 21:39:52 24 4
gpt4 key购买 nike

我正在从两个不同的线程接收视频 H264 编码数据和音频 G.711 PCM 编码数据以复用/写入 mov 多媒体容器。

writer 函数签名如下:

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(..) 函数中,我正在使用 av_init_packet(.. .) 并将pEncodedDataiLength 设置为packet.datapacket.size。我打印了 packet.ptspacket.dts 及其等效于 AV_NOPTS_VALUE

现在,我如何计算 PTS、DTS 和数据包持续时间(packet.dtspacket.ptspacket.duration ) 正确处理音频和视频数据,以便我可以同步音频和视频并正确播放?我在互联网上看到了很多例子,但对我来说没有一个有意义。我是 ffmpeg 的新手,在某些情况下我的概念可能不正确。我想以适当的方式去做。

提前致谢!

编辑:在我的视频流中,没有 B 帧。所以,我觉得PTS和DTS在这里可以保持一致。

最佳答案

PTS/DTS是时间戳,应该设置为输入数据的时间戳。我不知道你的日期来自哪里,但任何输入都有某种形式的时间戳与之相关联。通常,输入媒体文件的时间戳或系统时钟派生的指标(如果您是从声卡+网络摄像头录制的)等等。您应该将这些数字转换成预期的形式,然后将它们分配给AVPacket.pts/dts

关于c++ - 视频和音频帧的 PTS 和 DTS 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31917032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com