2012-04-14 32 views
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が、私は彼が私のために、異なる

+0

私はh.264の内部をよく知らないですが、MPEGと同じ問題がありますが、音声が始まる前に数フレーム必要です。 (私が何を話しているのかわからない場合は、gapless MP3を検索してください。一般的な問題です。多くの損失の多いコーデックでは問題と思われます。) – Brad

+0

私はビデオ圧縮の初心者です。これは分かっていますが、私はビデオのみをエンコードしています。オーディオはありません。 – Mat

+0

メーリングリストの人のようなスレッドを1つだけ使用していると仮定します。私が彼の例で見ているのは、エンコーダパラメータを手作業でたくさん設定していることです.ffmpegを使った私の経験は、ffmepgがプロセスのパラメータを調べるために使う経験則が少ない数フレームの遅れが生じる。彼が修正したすべてのパラメータを修正してみてください。 (例:mpCodecContext-> flags2 | = CODEC_FLAG2_FASTPSKIP;) – count0

答えて

2

コードのこの部分をやっているか見ていないがトリックをした:

av_opt_set(context->priv_data, "tune", "zerolatency", 0); 

(コンテキストを開く前にこの関数を呼び出してください)。

+1

具体的にしてください。このコードをOPのどこに提案しますか? –

関連する問題