informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Saat menggunakan avcodec_find_encoder_by_name untuk menemukan encoder,
const AVCodec * aacencoder = avcodec_find_encoder_berdasarkan_nama("libx264");
Nilai encodernya adalah:
id AV_CODEC_ID_H264 (27)
nama_panjang libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 bagian 10
nama libx264
pix_fmts AV_PIX_FMT_YUV420P (0)
ketik AVMEDIA_TYPE_VIDEO (0)
2. Setelah memanggil AVCodecContext *aacencodercontext = avcodec_alloc_context3(aacencoder);.
Encodernya sama seperti di atas, tidak ada perubahan
Konten dalam konteks encoder adalah:
Codec_id dan codec_type dalam konteks encoder memiliki nilai, dan nilai lainnya ditetapkan ulang ke nilai defaultnya.
kode_id AV_CODEC_ID_H264 (27)
tipe_codec AVMEDIA_TYPE_VIDEO (0)
Nilai defaultnya adalah sebagai berikut:
s->basis_waktu = (AVRasional){0,1};
s->framerate = (AVRational){ 0, 1 };
s->pkt_timebase = (AVRational){ 0, 1 };
3. Saat metode avcodec_open2(encoderAVCodecContext, encoderAVCodec, NULL) dipanggil, banyak parameter yang akan disetel.
Bisa dibayangkan dengan asumsi encodernya adalah AAC, parameter apa yang akan disetel?
Yang pertama adalah berapa banyak frame sampel yang dimiliki avframe.
3.1 Mulailah dengan avcodec_find_encoder atau avcodec_find_decoder di awal.
Caranya ada di file D:Ctoolyinshipinffmpeg-6.0sourcelibavcodecallcodecs.c.
konstan AVCodec * avcodec_find_encoder(enum AVCodecID id)
{
kembalikan find_codec(id, av_codec_is_encoder);
}
konstan AVCodec *avcodec_find_decoder(enum AVCodecID id)
{
kembalikan find_codec(id, av_codec_is_decoder);
}
3.2 Inti dari metode find_codec adalah metode av_codec_iterate
statis konstan AVCodec *temukan_codec(enum AVCodecID id, int (*x)(const AVCodec *))
{
const AVCodec *p, *eksperimental = NULL;
kosong *i = 0;
id = remap_deprecated_codec_id(id);
sementara ((p = av_codec_iterate(&i))) {
jika (!x(p))
melanjutkan;
jika (p->id == id) {
jika (p->kemampuan & AV_CODEC_CAP_EXPERIMENTAL dan !eksperimental) {
eksperimental = p;
} kalau tidak
kembali p;
}
}
kembali eksperimental;
}
3.3 Metode av_codec_iterate sebenarnya menemukan codec yang sesuai dari codec_list. Daftar ini sangat panjang, termasuk nama semua encoder dan decoder dalam ffmepg.
const AVCodec *av_codec_iterate(void **buram)
{
uintptr_t i = (uintptr_t)*buram;
const FFCodec *c = daftar_codec[i];
ff_thread_once(&av_codec_static_init, av_codec_init_static);
jika (c) {
*buram = (batal*)(i + 1);
kembali &c->p;
}
kembalikan NULL;
}
Kita dapat melihat bahwa ada beberapa aac yang sesuai dengan codec_list, dan kita menggunakan ff_aac_encoder untuk mengilustrasikannya.
Setelah mencari kodenya, saya menemukan bahwa definisi ff_aac_encoder ada di aacenc.c, yang berisi
Informasi berikut dapat dilihat dari D:Ctoolyinshipinffmpeg-6.0sourcelibavcodecaacenc.c,
Field.init = aac_encode_init, harus berupa fungsi,
Seperti yang Anda lihat dari fungsi aac_encode_init, frame_size adalah 1024
avctx->ukuran_bingkai = 1024;
konstan FFCodec ff_aac_encoder = {
.p.nama = "aac",
CODEC_LONG_NAME("AAC (Pengodean Audio Lanjutan)"),
.p.jenis = AVMEDIA_JENIS_AUDIO,
.p.id = ID_KODE_AV_AAC,
.p.kemampuan = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_KECIL_FRAME_TERAKHIR,
.priv_data_size = ukuran(AACEncContext),
.init = aac_encode_init,
FF_CODEC_ENCODE_CB(bingkai_enkode_aac),
.tutup = aac_encode_akhir,
.default = aac_encode_default,
.p.tingkat_sampel_yang_didukung = tingkat_sampel_ff_mpeg4audio,
.caps_internal = FF_CODEC_CAP_INIT_PEMBERSIHAN,
.p.sampel_fmts = (const enum AVSampleFormat[]){ AV_SAMPEL_FMT_FLTP,
AV_SAMPEL_FMT_TIDAK ADA },
.p.priv_kelas = &aacenc_kelas,
};
Pada titik ini, masih ada pertanyaan: kapan ff_aac_encoder diinisialisasi?
Faktanya, ret = avcodec_open2(avcodecContext,nullptr,nullptr); melakukan ini secara internal.
Kode inti sudah masuk
jika (codec2->init) {
Faktanya, itu akan disebut:
statis av_cold int aac_encode_init (AVCodecContext * avctx)