smplayer sitio sherpya reproductor pagina oficial mpv c x264 libavcodec libx264 libav

sitio - ¿Cómo codificar h.264 con libavcodec/x264?



smplayer media player free download (5)

A continuación se explica cómo interpretar los ajustes preestablecidos x264 de ffmpeg.

Desafortunadamente, no conozco una forma fácil de importar los ajustes preestablecidos como hace ffmpeg. Puede buscar los valores preestablecidos de x264 que están todos almacenados en /usr/local/share/ffmpeg/libx264-{name}.ffpreset, donde se especifica {name} para ffmpeg como el argumento de línea de comando -vpre {name}. Por lo general, ffmpeg incluiría libx264-medium.ffpreset y luego libx264-main.ffpreset, especificado como ffmpeg -vpre medium -vpre main

Puede buscar todas las opciones (como se define en los archivos libx264- {nombre} .ffpreset) para obtener sus nombres de estructura buscando en el archivo libavcodec / options.c, que se puede encontrar en los repositorios SVN de ffmpeg.

Así es como los presets de medios y principales se traducirían en código 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

Tendrá que mirar el código fuente de ffmpeg si desea analizar esos ajustes preestablecidos automáticamente.

Espero que la información que acabo de dar te ayude un poco más :)

Estoy intentando codificar video usando libavcodec / libavformat. El audio funciona muy bien, pero cuando intento codificar un video, obtengo los siguientes errores:

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

fácil de solucionar utilizando la línea de comandos ffmpeg, pero estoy tratando de hacer esto en C. Mis opciones son

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;

pero avcodec_open () falla.

¿Qué otros valores debo configurar para que x264 sea feliz?


Codifico imágenes YUV420P en diferentes formatos, usando diferentes codecs. CodecID que tomé de AVOutputFormat después de usar la función guess_format (...). Pero otras configuraciones de codec son (todas han sido tomadas del código fuente de los ejemplos de 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;

Esta configuración debe funcionar con la mayoría de los códecs, pero tuve un problema con los fps: no todos los códecs admiten valores de fps (y algunos otros parámetros también).


No estoy seguro de si lo tienes funcionando, pero los siguientes parámetros funcionan para mí.

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;

La broken ffmpeg default settings detected mensaje de error se muestra en la biblioteca x264 en x264/encoder/encoder.c cuando demasiadas configuraciones son las configuraciones predeterminadas de ffmpeg (por ejemplo, qmin = 2, qmax = 31, qcompress = 0.5 ), cambiando estos tres valores a otra cosa, por ejemplo, qmin = 10, qmax = 51, qcompress = 0.6 , resuelve el error.


No olvides usar las opciones privadas x264. Siempre puedes establecer un perfil:

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

O establezca la latencia de codificación más baja:

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

O seleccione un ajuste preestablecido:

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

Antes de abrir un codec

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


Parece que la versión ffmpeg 20130302 requiere algo como

c->profile = FF_PROFILE_H264_BASELINE;