ffmpeg使用记录

Q:在对AVPacket解码后得到的AVFrame,有时候其pts = -9223372036854775808(AV_NOPTS_VALUE)
A:不妨尝试一下函数av_frame_get_best_effort_timestamp(旧版)或者 属性best_effort_timestamp(新版)

            qDebug() << "find best:" << av_frame_get_best_effort_timestamp(pAVframe) << av_frame_get_best_effort_timestamp(pAVframeRGB);
            qDebug() << pAVframe->best_effort_timestamp << pAVframeRGB->best_effort_timestamp;

Q:在使用 h264_cuvid、hevc_cuvid 硬件解码时,帧的pts = -9223372036854775808(AV_NOPTS_VALUE)。且同时提示
[h264_cuvid @ 000001b39559eac0] Invalid pkt_timebase, passing timestamps as-is.
A:在初始化解码器之前,先对视频流解编码器上下文赋值

    //获取视频流解编码器上下文
    pCodecCtx = avcodec_alloc_context3(NULL);;

    AVStream *stream = pFormatCtx->streams[streamIndex];
    //查找适配的解码器
    avcodec_parameters_to_context(pCodecCtx, stream->codecpar);
    
    //    https://blog.csdn.net/huohongpeng/article/details/117163243
    /*
         * 如果不加,将获取不到解码后的pts值
         */
//    pCodecCtx->framerate.num = stream->avg_frame_rate.num;
//    pCodecCtx->framerate.den = stream->avg_frame_rate.den;
    pCodecCtx->pkt_timebase.num = stream->time_base.num; // 我的是加了这里才正常
    pCodecCtx->pkt_timebase.den = stream->time_base.den; // 我的是加了这里才正常

    // 根据id来创建硬件解码器
    switch (pCodecCtx->codec_id) {
    case AV_CODEC_ID_H264:
        pCodec = avcodec_find_decoder_by_name("h264_cuvid");
        break;
    case AV_CODEC_ID_H265:
        pCodec = avcodec_find_decoder_by_name("hevc_cuvid");
        break;
    default:
         pCodec = avcodec_find_decoder(pCodecCtx->codec_id); // 没有合适的硬件编码器,只能用软件编码器了
        break;
    }

Q:在观察ffmpeg的错误码时,还需要到他的头文件亿个个地找,很麻烦。是否可以直接将错误码转成相应的字符串?
A:可以。试试 av_strerror() 、av_err2str();其中av_err2会报错,解决办法。

你可能感兴趣的:(ffmpeg,ffmpeg)