ffmpeg :: avcodec_encode_video configurando PTS h264

Estoy tratando de codificar video como H264 usando libavcodec

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

devuelve un error que no tengo el valor avframe-> pts configurado correctamente.
He intentado configurarlo en 0,1, AV_NOPTS_VALUE y 90khz * framenumber pero todavía tengo el error non-strictly-monotonic PTS

El ejemplo de ffmpeg.c configura packet.pts con ffmpeg :: av_rescale_q (), ¡pero solo se llama después de haber codificado el marco!

Cuando se usa con el códec MP4V, avcodec_encode_video () establece el valor pts correctamente.

Tuve el mismo problema, lo resolví calculando pts antes de llamar a avcodec_encode_video de la siguiente manera:

 //Calculate PTS: (1 / FPS) * sample rate * frame number //sample rate 90KHz is for h.264 at 30 fps picture->pts = (1.0 / 30) * 90 * frame_count; out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture); 

Solución robada de esta útil entrada de blog

(Nota: la frecuencia de muestreo modificada a khz, expresada en hz fue demasiado larga entre cuadros, puede que tenga que jugar con este valor, no es un experto en encoding de video, solo quería algo que funcionara y esto funcionó)

Yo tuve este problema también. Dejé el problema de esta manera:

Antes de invocar

 ffmpeg::avcodec_encode_video(codec,output,size,avframe); 

establece el valor de pts de avframe un valor entero que tiene un valor inicial de 0 e incrementa en uno cada vez, así:

 avframe->pts = nextPTS(); 

La implementación de nextPTS () es:

 int nextPTS() { static int static_pts = 0; return static_pts ++; } 

Después de dar un valor a los pts de avframe, codifíquelo. Si la encoding se realiza correctamente. Agregue el siguiente código:

  if (packet.pts != AV_NOPTS_VALUE) packet.pts = av_rescale_q(packet.pts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base); if (packet.dts != AV_NOPTS_VALUE) packet.dts = av_rescale_q(packet.dts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base); 

Agregará el valor de dts correcto para el AVFrame codificado. Entre el código, paquete de tipo AVPacket, mOutputCodeCtxPtr de tipo AVCodecContext * y mOutputStreamPtr de tipo AVStream.

avcodec_encode_video devuelve 0 indica que el fotogtwig actual está almacenado en búfer, debe vaciar todos los fotogtwigs almacenados después de que todos los fotogtwigs se hayan codificado. El código vacía todas las ttwigs del búfer de manera similar a:

 int ret; while((ret = ffmpeg::avcodec_encode_video(codec,output,size,NULL)) >0) ;// place your code here. 

Yo tuve este problema también. Por lo que recuerdo, el error está relacionado con dts

ajuste

 out_video_packet.dts = AV_NOPTS_VALUE; 

me ayudó

Una función estrictamente monotónica de aumento es una función donde f (x)

    Intereting Posts