当视频不存在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;
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; }