4

フレーム(最初のフレームを含む)がエンコードされた直後にデコードに必要なデータが利用できるように、ビデオをエンコードしようとしています(現時点ではh264コーデックを使用していますが、私のニーズにより適している場合は他のコーデックでも問題ありません)。 (つまり、I フレームと P フレームのみが必要で、B フレームは必要ありません)。

このようなストリームを取得するには、AVCodecContext をどのように設定する必要がありますか? これまでのところ、値を使用してテストを行ったところ、最初のフレームで avcodec_encode_video() が常に 0 を返しました。

//編集: これは現在、AVCodecContext のセットアップ コードです。

static AVStream* add_video_stream(AVFormatContext *oc, enum CodecID codec_id, int w, int h, int fps)
{
    AVCodecContext *c;
    AVStream *st;
    AVCodec *codec;

    /* find the video encoder */
    codec = avcodec_find_encoder(codec_id);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }

    st = avformat_new_stream(oc, codec);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
        exit(1);
    }

    c = st->codec;

    /* Put sample parameters. */
    c->bit_rate = 400000;
    /* Resolution must be a multiple of two. */
    c->width    = w;
    c->height   = h;
    /* timebase: This is the fundamental unit of time (in seconds) in terms
     * of which frame timestamps are represented. For fixed-fps content,
     * timebase should be 1/framerate and timestamp increments should be
     * identical to 1. */
    c->time_base.den = fps;
    c->time_base.num = 1;
    c->gop_size      = 12; /* emit one intra frame every twelve frames at most */

    c->codec = codec;
    c->codec_type = AVMEDIA_TYPE_VIDEO;
    c->coder_type = FF_CODER_TYPE_VLC;
    c->me_method = 7; //motion estimation algorithm
    c->me_subpel_quality = 4;
    c->delay = 0; 
    c->max_b_frames = 0; 
    c->thread_count = 1; // more than one threads seem to increase delay
    c->refs = 3;

    c->pix_fmt       = PIX_FMT_YUV420P;

    /* Some formats want stream headers to be separate. */
    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
        c->flags |= CODEC_FLAG_GLOBAL_HEADER;

    return st;
}

ただし、この avcodec_encode_video() では、バイトを返す前に 13 フレームをバッファリングします (その後、すべてのフレームでバイトを返します)。gop_size を 0 に設定すると、avcodec_encode_video() は 2 番目のフレームが渡された後にのみバイトを返します。ただし、ゼロ遅延が必要です。

この男はどうやら成功していたようです (より大きな gop であっても) : http://mailman.videolan.org/pipermail/x264-devel/2009-May/005880.html

4

1 に答える 1