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