FFMPEG ビデオ PTS を取得

 動画に 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 ブログ

おすすめ

転載: blog.csdn.net/xiaowang_lj/article/details/129931088
おすすめ