FFMPEG と x264 エンコーダーを使用してフレームごとにビデオをトランスコードするアプリケーションがあります。このアプリケーションをリリースしようとしていますが、x264 のライセンスにより、代わりに openh264 を使用することに切り替えました。
すべてをスムーズにコンパイルすることができました(openh264、次にenable-openh264を使用したFFMPEG)。libx264で機能していたものが機能しなくなったため、Cコードでエンコーダーのセットアップを修正しようとしています。残念ながら、FFMPEG/openh264 の非常に限られた C/C++ の例を見つけました。リンク/ヒントをいただければ幸いです。
次のコードを使用しています (dec_ctx は、デコードしているビデオの AVCodecContext です)
enc_ctx->height = dec_ctx->height;
enc_ctx->width = dec_ctx->width;
enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
/* take first format from list of supported formats */
enc_ctx->pix_fmt = encoder->pix_fmts[0];
/* video time_base can be set to whatever is handy and supported by encoder */
enc_ctx->time_base = dec_ctx->time_base;
enc_ctx->gop_size = 120; /* emit one intra frame every twelve frames at most */
enc_ctx->max_b_frames = 16;
enc_ctx->scenechange_threshold = 0;
enc_ctx->rc_buffer_size = 0;
enc_ctx->me_method = ME_ZERO;
enc_ctx->ticks_per_frame = dec_ctx->ticks_per_frame * ifmt_ctx->streams[i]->time_base.den * ifmt_ctx->streams[i]->r_frame_rate.num/ifmt_ctx->streams[i]->r_frame_rate.den;
// Set Ultrafast profile. internal name for this preset is baseline
av_opt_set(enc_ctx->priv_data, "preset", "placebo", AV_OPT_SEARCH_CHILDREN);
[OpenH264] タグの出力に次のエラーが表示されます。
[OpenH264] this = 0x0000000019C126C0, Warning:bEnableFrameSkip = 0,bitrate can't be controlled for RC_QUALITY_MODE,RC_BITRATE_MODE and RC_TIMESTAMP_MODE without enabling skip frame.
Output #0, mp4, to 'C:\Dev\temp\geoVid.mp4':
Stream #0:0: Video: h264 (libopenh264), yuv420p, 720x480, q=2-31, 200 kb/s, 90k tbn, 180k tbc
Stream #0:1: Audio: aac, 48000 Hz, stereo, fltp, 96 kb/s
[OpenH264] this = 0x0000000019C126C0, Warning:Actual input framerate fAverageFrameRate = 0.000000 is quite different from framerate in setting 60.000000, please check setting or timestamp unit (ms), start_Ts = 0
[OpenH264] this = 0x0000000019C126C0, Warning:Actual input framerate fAverageFrameRate = 0.000000 is quite different from framerate in setting 60.000000, please check setting or timestamp unit (ms), start_Ts = 0
出力ビデオ ファイルは、黒いフレームだけを再生します。ドキュメントへのヒントやリンクをいただければ幸いです。これらのエラーを理解しようとしていますが、「フレームをスキップ」を有効にする方法や、入力フレームレートについて不平を言う理由がよくわかりません (これは、libx264 で正常にエンコードした場合と同じ入力です)