理论:
- ffmpeg里面有个time_base的概念,刻度,这是ffmpeg里面时间的基本刻度,时间基.
如果把1秒分为25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。此时的time_base={1,25} .
如果你是把1秒分成90000份,每一个刻度就是1/90000秒,此时的time_base={1,90000}。
所谓时间基表示的就是每个刻度是多少秒 - pts的值就是占多少个时间刻度(占多少个格子)。它的单位不是秒,而是时间刻度。只有pts加上time_base两者同时在一起,才能表达出时间是多少。
- 在ffmpeg中。av_q2d(time_base)=每个刻度是多少秒 .
此时你应该不难理解 pts*av_q2d(time_base)才是帧的显示时间戳。
代码:
- 获取音频时 求出总时长
audio->duration = pFormatCtx->duration / AV_TIME_BASE;//求出总时长
LOGD("总时长 %d", audio->duration);
audio->time_base = pFormatCtx->streams[i]->time_base;
time_base 是刻度.
2. 重采样的时候 获取当前播放的时间
now_time = avFrame->pts * av_q2d(time_base);
if (now_time < clock) {
now_time = clock;
}
clock = now_time;
- 在openSL 回调方法里 pcmBufferCallBack 重采样之后 获取当前实际的时间
//重采样
int buffersize = xyAudio->resampleAudio();
//获取当前实际的clock 根据pcm的大小求播放时间 为了时间更精确
xyAudio->clock += buffersize / ((double) (xyAudio->sample_rate * 2 * 2));
//如果大于0.1秒
if (xyAudio->clock - xyAudio->last_time >= 0.1) {
xyAudio->last_time = xyAudio->clock;
//进行回调播放时间
xyAudio->callJava->onCallTimeInfo(CHILD_THREAD, xyAudio->clock, xyAudio->duration);
}
https://blog.csdn.net/bixinwei22/article/details/78770090
这个说的不错.