视频和音频帧的PTS和DTS计算
PTS and DTS calculation for video and audio frames
我正在接收来自两个不同线程的视频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(..)
函数中,我使用av_init_packet(...)
创建AVPakcet
,并将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在这里可以保持一致。PTS/DTS为时间戳,应设置为输入数据的时间戳。我不知道你的日期是从哪来的,但任何输入都有某种形式的时间戳与之相关。通常,输入媒体文件的时间戳或系统时钟派生的度量(如果您正在从声卡+网络摄像头等进行录制)。您应该将这些数字转换成预期的形式,然后将它们分配给AVPacket.pts/dts
。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算PTS和DTS正确同步音频和视频
- 视频和音频帧的PTS和DTS计算