FFMpeg 获取音频播放时长 以及当前时长

https://blog.csdn.net/bixinwei22/article/details/78770090
这个说的不错.
理论:

  1. ffmpeg里面有个time_base的概念,刻度,这是ffmpeg里面时间的基本刻度,时间基.
    如果把1秒分为25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。此时的time_base={1,25} .
    如果你是把1秒分成90000份,每一个刻度就是1/90000秒,此时的time_base={1,90000}。
    所谓时间基表示的就是每个刻度是多少秒
  2. pts的值就是占多少个时间刻度(占多少个格子)。它的单位不是秒,而是时间刻度。只有pts加上time_base两者同时在一起,才能表达出时间是多少。
  3. 在ffmpeg中。av_q2d(time_base)=每个刻度是多少秒 .
    此时你应该不难理解 pts*av_q2d(time_base)才是帧的显示时间戳。

代码:

  1. 获取音频时 求出总时长
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;
  1. 在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);
            }


你可能感兴趣的:(android,ndk,系列,android,NDK)