FFMPEG 获取视频PTS

 当视频不存在PTS信息时,用DTS代替PTS

PTS不存在时 打印出来是   -9223372036854775808

if(packet->dts == AV_NOPTS_VALUE && packet->pts && packet->pts != AV_NOPTS_VALUE){
      VideoPTS = packet->pts;
}else if(packet->dts != AV_NOPTS_VALUE){
       VideoPTS = packet->dts;
}else{
      VideoPTS = 0;
}

VideoPTS *= av_q2d(formatContext->streams[video_stream_index]->time_base);

音视频同步

三种方式:本质都是获取时间差然后让线程休眠  sleep usleep

音频向视频同步 获取PTS的差值

视频向音频同步

音视频向系统时钟同步

多线程解码

ffmpeg 内部avcodec_open2后, m_pVideoCodecContext->thread_count 的数量与cpu内核数相同。所以如果编解码视频数量过多,而且cpu内核数也很大,很容易将整个进程线程数变得很大。而当一个进程线程数大于1000后,该进程将被系统自动杀死。

因此可以在调用avcodec_open2函数之前 ,手动设置thread_count个数。

AVCodecContext *codecContext = avcodec_alloc_context3(videoDecoder);
codecContext->thread_count = 4;

Android MediaCodec硬解码、ffmpeg软解码,兼顾机型一致性和性能 - 简书 (jianshu.com)

C语言获取系统时间戳

毫秒级别

long long GetSysCurrentTime(){
    struct timeval tv;
    gettimeofday(&tv, NULL);
    long long milliseconds = (long long)tv.tv_sec * 1000 + (long long)tv.tv_usec / 1000;
    //LOGE(LOG_TAG,"start_time %lld",milliseconds);
    return milliseconds;
}

 (291条消息) C语言-获取系统时间_c语言获取当前时间_hskwcy的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/xiaowang_lj/article/details/129931088