SORU
30 Mayıs 2010, Pazar


Nasıl bir H264 x264 C API kullanarak bir dizi görüntü kodlama?

Nasıl bir H264 çerçeve içine RGB görüntüleri kodlamak için C x264 API kullanır? Ben zaten RGB Görüntü bir dizi yarattı, şimdi nasıl H264 kare bir dizi içine sırasını değiştirebilir miyim? Özellikle, nasıl H264 tek Kare ilk H264 H264 bağımlı bir anahtar kare kare izledi oluşan bir dizi içine RGB görüntülerin bu dizi kodlamak mı?

CEVAP
30 Mayıs 2010, Pazar


Birincisi: x264 kontrol edin.h dosya, her işlev ve yapı için daha fazla veya daha az başvuru içerir. Bu x264.c download örnek bir uygulama içerir bulabilirsiniz dosyası. Çoğu insan kendini kalede bu sefer dersin ama ancak geri düşmek için bir örnek olarak iyidir yeni başlayanlar için oldukça karmaşık buluyorum.

Öncelikle bazı parametreler, bu tür x264_param_t, iyi bir site http://mewiki.project357.com/wiki/X264_Settings parametreleri açıklayan ayarlayın . Ayrıca (bazen oldukça karmaşık) tüm parametreler anlamak gerek kalmadan bazı işlevler hedef sağlar x264_param_default_preset işlevi bir göz atın. Ayrıca kullanımı x264_param_apply_profile (muhtemelen "baseline" profili) . istersiniz sonra

Bu bir örnek benim koddan kurulum

x264_param_t param;
x264_param_default_preset(¶m, "veryfast", "zerolatency");
param.i_threads = 1;
param.i_width = width;
param.i_height = height;
param.i_fps_num = fps;
param.i_fps_den = 1;
// Intra refres:
param.i_keyint_max = fps;
param.b_intra_refresh = 1;
//Rate control:
param.rc.i_rc_method = X264_RC_CRF;
param.rc.f_rf_constant = 25;
param.rc.f_rf_constant_max = 35;
//For streaming:
param.b_repeat_headers = 1;
param.b_annexb = 1;
x264_param_apply_profile(¶m, "baseline");

Bundan sonra aşağıdaki gibi kodlayıcı başlatabilir

x264_t* encoder = x264_encoder_open(¶m);
x264_picture_t pic_in, pic_out;
x264_picture_alloc(&pic_in, X264_CSP_I420, w, h)

X264 YUV420P veri (diğerleri de sanırım, ama ortak bir şey) bekliyor. Libswscale (ffmpeg) doğru biçime görüntüleri dönüştürmek için kullanabilirsiniz. Bu başlatılıyor bu (24bpp RGB veri varsayıyorum) gibi.

struct SwsContext* convertCtx = sws_getContext(in_w, in_h, PIX_FMT_RGB24, out_w, out_h, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);

kodlama sonra, her bir kare için bu kadar basit

//data is a pointer to you RGB structure
int srcstride = w*3; //RGB stride is just 3*width
sws_scale(convertCtx, &data, &srcstride, 0, h, pic_in.img.plane, pic_in.img.stride);
x264_nal_t* nals;
int i_nals;
int frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);
if (frame_size >= 0)
{
    // OK
}

Bu seni kendine getirir umarım;) kendim uzun bir zaman başlamak için harcadım. X264 yazılım delicesine güçlü ama bazen karmaşık bir parça.

edit: gecikmeli Kare olacak diğer parametreleri kullandığınızda, bu benim parametreleri (nolatency seçeneği nedeniyle çoğunlukla) ile durum böyle değil. Bu durumda, frame_size bazen sıfır olacak ve x264_encoder_encode sürece işlev olarak. eğer x264_encoder_delayed_frames 0 döndürmez. Ama bu işlevi x264 içine daha derin bir göz atmanız gerekir.c ve x264.h .

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LevelUpTuts

    LevelUpTuts

    20 Ocak 2012
  • Mindy

    Mindy

    20 NİSAN 2006
  • Simon Hayter

    Simon Hayter

    20 HAZİRAN 2010