2017-11-29 5 views
0

私はエンコーダ(x264)を使用するときffmpegについて質問したいと思います。ffmpegのエンコード後、AVPacketのptsとdtsはAV_NOPTS_VALUEです

これは私のコードです:

int 
FFVideoEncoder::init(AVCodecID codecId, int bitrate, int fps, int gopSize, 
        int width, int height, AVPixelFormat format) { 
    release(); 

    const AVCodec *codec = avcodec_find_encoder(codecId); 
    m_pCodecCtx = avcodec_alloc_context3(codec); 
    m_pCodecCtx->width = width; 
    m_pCodecCtx->height = height; 
    m_pCodecCtx->pix_fmt = format; 
    m_pCodecCtx->bit_rate = bitrate; 
    m_pCodecCtx->thread_count = 5; 
    m_pCodecCtx->max_b_frames = 0; 
    m_pCodecCtx->gop_size = gopSize; 

    m_pCodecCtx->time_base.num = 1; 
    m_pCodecCtx->time_base.den = fps; 

    //H.264 
    if (m_pCodecCtx->codec_id == AV_CODEC_ID_H264) { 
//  av_dict_set(&opts, "preset", "slow", 0); 
     av_dict_set(&m_pEncoderOpts, "preset", "superfast", 0); 
     av_dict_set(&m_pEncoderOpts, "tune", "zerolatency", 0); 

     m_pCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER; 
     m_pCodecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; 
    } 
    int ret = avcodec_open2(m_pCodecCtx, m_pCodecCtx->codec, &m_pEncoderOpts); 
    if (ret == 0) { 
     LOGI("open avcodec success!"); 
    } else { 
     LOGE("open avcodec error!"); 
     return -1; 
    } 
    return ret; 
} 

int FFVideoEncoder::encode(const Frame &inFrame, AVPacket *outPacket) { 
    AVFrame *frame = av_frame_alloc(); 
// avpicture_fill((AVPicture *) frame, inFrame.getData(), AV_PIX_FMT_YUV420P, inFrame.getWidth(), 
//     inFrame.getHeight()); 
    av_image_fill_arrays(frame->data, frame->linesize, inFrame.getData(), m_pCodecCtx->pix_fmt, 
         inFrame.getWidth(), inFrame.getHeight(), 1); 

    int ret = 0; 
    ret = avcodec_send_frame(m_pCodecCtx, frame); 
    if (ret != 0) { 
     LOGE("send frame error! %s", av_err2str(ret)); 
    } else { 
     ret = avcodec_receive_packet(m_pCodecCtx, outPacket); 
     LOGI("extract data size = %d", m_pCodecCtx->extradata_size); 
     if (ret != 0) { 
      LOGE("receive packet error! %s", av_err2str(ret)); 
     } 
    }; 
    av_frame_free(&frame); 
    return ret; 
} 

私はAVPacketはこのフレームについてのPTSとDTSを運ぶことを期待しています。

実際には、私はエンコードされたフレームデータとサイズしか取得できません。

//この質問除く====================================

を、私は別の疑問を持っています:

x264 docsは映画、アニメーションなどのように設定することができます。私は "zerolatency"パラメータを設定すると、私は通常のビデオを取得することができます。私が他の人に設定すると、ビデオのビットレートは非常に低くなります。

ありがとうございました。

答えて

0

これは、それが動作するかどうかを確認するために簡単な例です:

私はあなたが事前にframe->pts設定する必要があります信じています。あなたがエンコードのための送信フレームのシンプルなカウンタとして、このframecountを追加ret = avcodec_send_frame(m_pCodecCtx, frame)

に送信する前に
設定frame->pts = framecount
はこれを試してみてください。毎回増加します。
希望に役立ちます。

+0

OMG。ご協力いただきありがとうございます。実際には私はすべてのフレームのPTSを持っています。私はAVFrameにptsを設定すると、それは動作します! –

関連する問題