时间戳基本概念
时间戳:计算的单位不是秒,时间戳的单位采用的是采样频率的倒数,这样做的目的就是为了时间戳单位更精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。
时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。ORTP库中根据负载类型直接给定了时间戳的单位(音频负载1/8000,视频负载1/90000)。如果采样频率为90000Hz,则由上面讨论可知,时间戳单位为1/90000,我们就假设1秒钟被划分了90000个时间块,那么,如果每秒发送25帧,那么,每一个帧的发送占多少个时间块呢?当然是 90000/25 = 3600。因此,我们根据定义“时间戳增量是发送第二个RTP包相距发送第一个RTP包时的时间间隔”,故时间戳增量应该为3600。如果fps=50,那么pts增量就是1800。本人此处踩坑,设置fps=50,h264编码始终是25.
采样频率: 也叫时钟频率,即每秒钟抽取样本的次数,例如音频的采样率8000Hz,48k Hz等。
code:
extern "C"
{
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}
#include <iostream>
using namespace std;
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"swscale.lib")
int main()
{
char infile[] = "out.rgb";
char outfile[] = "rgb.mp4";
//新版ffmpeg 不用注册
FILE *fp = fopen(infile,"rb");
if (!fp)
{
cout << infile << " open failed!" << endl;
getchar();
return -1;
}
int width = 848;
int height = 480;
int fps = 25;
//1 创建编码器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!codec)
{
cout << " avcodec_find_encoder AV_COD

本文详细介绍了如何在使用FFmpeg进行H264视频编码时,正确设置时间戳(PTS)和适应不同帧率,特别强调了采样频率和时间戳增量的概念。通过实例展示了如何设置时间戳基线和调整GOP大小以实现低延迟编码。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



