私はビデオをエンコードしようとしています(現時点では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が、私は彼が私のために、異なる
私はh.264の内部をよく知らないですが、MPEGと同じ問題がありますが、音声が始まる前に数フレーム必要です。 (私が何を話しているのかわからない場合は、gapless MP3を検索してください。一般的な問題です。多くの損失の多いコーデックでは問題と思われます。) – Brad
私はビデオ圧縮の初心者です。これは分かっていますが、私はビデオのみをエンコードしています。オーディオはありません。 – Mat
メーリングリストの人のようなスレッドを1つだけ使用していると仮定します。私が彼の例で見ているのは、エンコーダパラメータを手作業でたくさん設定していることです.ffmpegを使った私の経験は、ffmepgがプロセスのパラメータを調べるために使う経験則が少ない数フレームの遅れが生じる。彼が修正したすべてのパラメータを修正してみてください。 (例:mpCodecContext-> flags2 | = CODEC_FLAG2_FASTPSKIP;) – count0