Question

Je cherche à encoder la vidéo en utilisant libavcodec / libavformat. Audio fonctionne très bien, mais lorsque je tente de vidéo encode je reçois les erreurs suivantes:

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

facile à fixer en utilisant la ligne de commande ffmpeg, mais je suis en train de le faire en C. mes options sont

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;  

mais avcodec_open () échoue.

Quelles autres valeurs dois-je faire ensemble heureux x264?

Était-ce utile?

La solution

Je ne sais pas si vous l'avez travail, mais les paramètres suivants travailler pour moi.

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;

Le message d'erreur est affiché broken ffmpeg default settings detected dans la bibliothèque x264 dans x264 / encodeur / encoder.c lorsque trop de paramètres sont les paramètres par défaut de ffmpeg (par exemple qmin = 2, qmax = 31, qcompress = 0.5), l'évolution de ces trois valeurs à autre chose, par exemple qmin = 10, qmax = 51, qcompress = 0.6, résout l'erreur.

Autres conseils

Ne pas oublier d'utiliser les options x264 privées. Vous pouvez toujours définir un profil:

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

Ou régler la latence la plus basse d'encodage:

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

Vous pouvez également sélectionner un paramètre prédéfini:

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

Avant d'ouvrir un codec

avcodec_open2(This->context, This->codec, &This->opts)

Voici comment interpréter les paramètres prédéfinis x264 du ffmpeg.

Malheureusement, je ne sais pas d'un moyen facile d'importer les paramètres prédéfinis comme ffmpeg fait. Vous pouvez rechercher les valeurs prédéfinies x264 qui sont tous stockés dans /usr/local/share/ffmpeg/libx264-{name}.ffpreset, où {name} est spécifié pour ffmpeg comme argument de ligne de commande de -vpre {name}. Donc, généralement ffmpeg comprendrait libx264-medium.ffpreset puis libx264-main.ffpreset, spécifié comme moyen ffmpeg -vpre -vpre principal

Vous pouvez rechercher toutes les options (telles que définies dans le libx264- {name} fichiers .ffpreset) pour obtenir leur nom de structure en regardant dans le fichier libavcodec / options.c, qui se trouve dans les dépôts SVN ffmpeg.

Voici comment les préréglages moyens et principaux seraient traduits en code C:

// 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

Vous devrez regarder le code source ffmpeg si vous voulez analyser les paramètres prédéfinis automatiquement.

J'espère que les informations que je viens de donner vous aiderait un peu plus:)

J'encode YUV420P images dans différents formats, en utilisant différents codecs. Je CodecID pris de AVOutputFormat après avoir utilisé la fonction guess_format (...). Mais d'autres paramètres codec sont (Tous ont été prises à partir du code source d'exemples ffmpeg):

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; 

Ce paramètre doit travailler à la plupart des codecs, mais j'eu un problème avec fps:. Pas tous les codecs prend en charge toutes les valeurs de fps (et d'autres paramètres aussi)

semble que la version ffmpeg 20130302 exige quelque chose comme

c->profile = FF_PROFILE_H264_BASELINE;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top