it-swarm.com.de

Wie kodiere ich h.264 mit libavcodec/x264?

Ich versuche, das Video mit libavcodec/libavformat zu kodieren. Audio funktioniert großartig, aber wenn ich versuche, Video zu kodieren, erhalte ich folgende Fehler:

[libx264 @ 0x10182a000]broken ffmpeg default settings detected  
[libx264 @ 0x10182a000]use an encoding preset (vpre)  

mit der Befehlszeile ffmpeg leicht zu beheben, aber ich versuche dies in C. Meine Optionen sind

AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);  
AVCodecContext *pVideoOutCodecCtx  = pVideoOutStream->codec;  

pVideoOutCodecCtx->codec_id        = CODEC_ID_H264;    
pVideoOutCodecCtx->codec_type      = CODEC_TYPE_VIDEO;  
pVideoOutCodecCtx->bit_rate        = pVideoInCodecCtx->bit_rate;  
pVideoOutCodecCtx->width           = pVideoInCodecCtx->width;    
pVideoOutCodecCtx->height          = pVideoInCodecCtx->height;  
pVideoOutCodecCtx->pix_fmt         = pVideoInCodecCtx->pix_fmt;    
pVideoOutCodecCtx->sample_rate     = pVideoInCodecCtx->sample_rate;    
pVideoOutCodecCtx->gop_size        = 30;  

avcodec_open () schlägt jedoch fehl.

Welche anderen Werte muss ich einstellen, um x264 glücklich zu machen?

18
szatmary

Ich bin nicht sicher, ob Sie es funktionieren, aber die folgenden Parameter funktionieren für mich.

ctx->bit_rate = 500*1000;
ctx->bit_rate_tolerance = 0;
ctx->rc_max_rate = 0;
ctx->rc_buffer_size = 0;
ctx->gop_size = 40;
ctx->max_b_frames = 3;
ctx->b_frame_strategy = 1;
ctx->coder_type = 1;
ctx->me_cmp = 1;
ctx->me_range = 16;
ctx->qmin = 10;
ctx->qmax = 51;
ctx->scenechange_threshold = 40;
ctx->flags |= CODEC_FLAG_LOOP_FILTER;
ctx->me_method = ME_HEX;
ctx->me_subpel_quality = 5;
ctx->i_quant_factor = 0.71;
ctx->qcompress = 0.6;
ctx->max_qdiff = 4;
ctx->directpred = 1;
ctx->flags2 |= CODEC_FLAG2_FASTPSKIP;

Die Fehlermeldung broken ffmpeg default settings detected wird in der x264-Bibliothek in x264/encoder/encoder.c angezeigt, wenn zu viele Einstellungen die Standardeinstellungen von ffmpeg sind (z. B. qmin = 2, qmax = 31, qcompress = 0.5). qmin = 10, qmax = 51, qcompress = 0.6, behebt den Fehler.

10
Shea

Vergessen Sie nicht, private x264-Optionen zu verwenden. Sie können immer ein Profil festlegen:

av_dict_set(&This->opts, "vprofile", "baseline", 0)

Oder legen Sie die niedrigste Codierungslatenz fest:

av_dict_set(&This->opts, "tune", "zerolatency", 0);

Oder wählen Sie eine Voreinstellung:

av_dict_set(&This->opts, "preset","ultrafast",0);

Vor dem Öffnen eines Codecs

avcodec_open2(This->context, This->codec, &This->opts)
23
Sergey Skopus

Im Folgenden erfahren Sie, wie Sie die x264-Voreinstellungen von ffmpeg interpretieren.

Leider kenne ich keine einfache Möglichkeit, Presets wie ffmpeg zu importieren. Sie können die voreingestellten x264-Werte nachschlagen, die alle in /usr/local/share/ffmpeg/libx264-{name}.ffpreset gespeichert sind, wobei {name} für ffmpeg als Befehlszeilenargument -vpre {name} angegeben ist. Normalerweise enthält ffmpeg daher libx264-medium.ffpreset und dann libx264-main.ffpreset, angegeben als ffmpeg -vpre medium -vpre main

Sie können alle Optionen (wie in den libx264- {name} .ffpreset-Dateien definiert) nachschlagen, um ihre Strukturnamen in der libavcodec/options.c -Datei zu finden, die sich in den ffmpeg-SVN-Repositorys befindet.

So würden die Medien- und Hauptvorgaben in C-Code übersetzt:

// libx264-medium.ffpreset preset
ctx->coder_type = 1;  // coder = 1
ctx->flags|=CODEC_FLAG_LOOP_FILTER;   // flags=+loop
ctx->me_cmp|= 1;  // cmp=+chroma, where CHROMA = 1
ctx->partitions|=X264_PART_I8X8+X264_PART_I4X4+X264_PART_P8X8+X264_PART_B8X8; // partitions=+parti8x8+parti4x4+partp8x8+partb8x8
ctx->me_method=ME_HEX;    // me_method=hex
ctx->me_subpel_quality = 7;   // subq=7
ctx->me_range = 16;   // me_range=16
ctx->gop_size = 250;  // g=250
ctx->keyint_min = 25; // keyint_min=25
ctx->scenechange_threshold = 40;  // sc_threshold=40
ctx->i_quant_factor = 0.71; // i_qfactor=0.71
ctx->b_frame_strategy = 1;  // b_strategy=1
ctx->qcompress = 0.6; // qcomp=0.6
ctx->qmin = 10;   // qmin=10
ctx->qmax = 51;   // qmax=51
ctx->max_qdiff = 4;   // qdiff=4
ctx->max_b_frames = 3;    // bf=3
ctx->refs = 3;    // refs=3
ctx->directpred = 1;  // directpred=1
ctx->trellis = 1; // trellis=1
ctx->flags2|=CODEC_FLAG2_BPYRAMID+CODEC_FLAG2_MIXED_REFS+CODEC_FLAG2_WPRED+CODEC_FLAG2_8X8DCT+CODEC_FLAG2_FASTPSKIP;  // flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip
ctx->weighted_p_pred = 2; // wpredp=2

// libx264-main.ffpreset preset
ctx->flags2|=CODEC_FLAG2_8X8DCT;c->flags2^=CODEC_FLAG2_8X8DCT;    // flags2=-dct8x8

Sie müssen sich den Quellcode von ffmpeg ansehen, wenn Sie diese Voreinstellungen automatisch analysieren möchten.

Ich hoffe, dass die Informationen, die ich gerade gegeben habe, Ihnen ein bisschen mehr helfen würden :)

15
Pada

Ich codiere YUV420P-Bilder in verschiedenen Formaten mit verschiedenen Codecs. CodecID, das ich aus AVOutputFormat nach der Verwendung der Funktion guess_format (...) übernommen habe. Andere Codec-Einstellungen sind jedoch (Alle wurden aus dem Quellcode von ffmpeg-Beispielen übernommen):

c->codec_id = (CodecID)CODEC_ID_H264; //This is your codec id
c->codec_type = CODEC_TYPE_VIDEO;

c->bit_rate = 1000000;  
c->width = <...>;  
c->height = <...>;  
c->time_base.den = 25;  
c->time_base.num = 1;  
c->gop_size = 12;  
c->pix_fmt = PIX_FMT_YUV420P;  
if (c->codec_id == CODEC_ID_MPEG1VIDEO) //It not necessary for you 
   c->mb_decision=2;  
// some formats want stream headers to be separate  
if(oc->oformat->flags & AVFMT_GLOBALHEADER)  
   c->flags |= CODEC_FLAG_GLOBAL_HEADER; 

Diese Einstellung muss für die meisten Codecs funktionieren, aber ich hatte ein Problem mit fps: Nicht alle Codecs unterstützen fps-Werte (und einige andere Parameter).

3
Petroff

anscheinend benötigt die ffmpeg-version 20130302 so etwas

c->profile = FF_PROFILE_H264_BASELINE;
0
Jochen