動画に PTS 情報がない場合は、PTS の代わりに DTS を使用します
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);
オーディオとビデオの同期
3 つの方法: 本質は、時間差を取得し、スレッドをスリープ状態にすることです。
オーディオをビデオに同期して 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 ブログ