私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. avcodec_find_encoder_by_name を使用してエンコーダーを検索する場合、
const AVCodec * aacencoder = avcodec_find_encoder_by_name("libx264");
エンコーダ値は次のとおりです。
id AV_CODEC_ID_H264 (27)
long_name libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 パート 10
名前 libx264
pix_fmts AV_PIX_FMT_YUV420P (0)
タイプ AVMEDIA_TYPE_VIDEO (0)
2. AVCodecContext *aacencodercontext = avcodec_alloc_context3(aacencoder); を呼び出した後。
エンコーダは上記と同じで、変更はありません
エンコーダ コンテキストの内容は次のとおりです。
エンコーダ コンテキストの codec_id と codec_type には値があり、その他はデフォルト値に再割り当てされます。
コーデックID AV_CODEC_ID_H264 (27)
コーデックタイプ AVMEDIA_TYPE_VIDEO (0)
デフォルト値は次のとおりです。
s->time_base = (AVRational){0,1};
s->フレームレート = (AVRational){ 0, 1 };
s->pkt_timebase = (AVRational){ 0, 1 };
3. avcodec_open2(encoderAVCodecContext, encoderAVCodec, NULL) メソッドが呼び出されると、多くのパラメータが設定されます。
エンコーダーが AAC であると仮定すると、どのようなパラメーターが設定されるかが想像できます。
1 つ目は、avframe に含まれるサンプル フレームの数です。
3.1 最初に avcodec_find_encoder または avcodec_find_decoder から開始します。
このメソッドは、ファイル D:Ctoolyinshipinffmpeg-6.0sourcelibavcodecallcodecs.c にあります。
定数 AVCodec *avcodec_find_encoder(列挙型 AVCodecID id)
{
find_codec(id, av_codec_is_encoder) を返します。
}
定数 AVCodec *avcodec_find_decoder(列挙型 AVCodecID id)
{
find_codec(id, av_codec_is_decoder) を返します。
}
3.2 find_codec メソッドの中核は av_codec_iterate メソッドです
静的定数 AVCodec *find_codec(列挙型 AVCodecID id、int (*x)(定数 AVCodec *))
{
const AVCodec *p、*実験的 = NULL;
void *i = 0;
id = remap_deprecated_codec_id(id);
((p = av_codec_iterate(&i))) の間 {
もし (!x(p))
続く;
(p->id == id)の場合{
p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental の場合 {
実験的 = p;
} それ以外
p を返します。
}
}
実験的なものを返す。
}
3.3 av_codec_iterate メソッドは実際に codec_list から対応するコーデックを検索します。このリストは非常に長く、ffmepg 内のすべてのエンコーダーとデコーダーの名前が含まれます。
定数 AVCodec *av_codec_iterate(void **不透明)
{
uintptr_t i = (uintptr_t)*不透明;
FFCodec *c = codec_list[i];
ff_thread_once(&av_codec_static_init, av_codec_init_static);
もし(c){
*不透明 = (void*)(i + 1);
&c->p; を返します。
}
NULL を返します。
}
codec_list に対応する aac が複数あることがわかります。説明のために ff_aac_encoder を使用します。
コードを検索したところ、ff_aac_encoder の定義が aacenc.c にあることがわかりました。
次の情報は、D:Ctoolyinshipinffmpeg-6.0sourcelibavcodecaacenc.c から確認できます。
Field.init = aac_encode_init、関数である必要があります。
aac_encode_init 関数からわかるように、frame_size は 1024 です。
avctx->フレームサイズ = 1024;
定数FFCodec ff_aac_encoder = {
.p.name = "aac",
CODEC_LONG_NAME("AAC (Advanced Audio Coding)"),
.p.type = AVMEDIA_TYPE_AUDIO、
.p.id = AV_CODEC_ID_AAC、
.p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SMALL_LAST_FRAME、
.priv_data_size = sizeof(AACEncContext)、
.init = aac_encode_init、
FF_CODEC_ENCODE_CB(aac_encode_frame)、
.close = aac_encode_end、
.defaults = aac_encode_defaults、
.p.supported_samplerates = ff_mpeg4audio_sample_rates、
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP、
.p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
.p.priv_class = &aacenc_class,
};
この時点では、ff_aac_encoder はいつ初期化されたのかという疑問がまだ残っています。
実際、ret = avcodec_open2(avcodecContext,nullptr,nullptr); はこれを内部的に行います。
コアコードは次のとおりです
(codec2->init)の場合{
実際には、次のように呼ばれます。
静的 av_cold int aac_encode_init(AVCodecContext *avctx)