avconv se plaint “non monotone croissante dts au format stream” lorsque la tuyauterie de libx264 sur 14.04
J'ai un morceau de code qui prend un flux d'images et les écrit dans un fichier à l'aide de x264 pour encoder et avconv. Pertinentes bits sont comme suit
//Setup encoder
sprintf(cmd, "avconv -i pipe: -vcodec copy %s", filename);
fp = popen(cmd, "w");
x264_param_default_preset(¶ms, "ultrafast", "stillimage,zerolatency");
params.i_fps_num = fps;
params.i_fps_den = 1;
x264_picture_alloc(&in, X264_CSP_I420, width, height);
params.i_csp = X264_CSP_I420;
in.img.i_csp = X264_CSP_I420;
x.params.b_vfr_input = 0;
in.i_pts = -1;
out.i_pts = -1;
params.i_width = width;
params.i_height = height;
encoder = x264_encoder_open(¶ms);
in.img.i_plane = 1;
in.img.i_stride[0] = width;
ret = x264_encoder_headers(encoder, &nals, &nheader);
header_size = nals[0].i_payload + nals[1].i_payload + nals[2].i_payload;
fwrite(nals[0].p_payload, header_size, 1, fp);
...
//Loop body
++in.i_pts;
frame_size = x264_encoder_encode(encoder, &nals, &num_nals, &in, &out);
fwrite(nals[0].p_payload, frame_size, 1, fp);
J'ai laissé de côté la vérification des erreurs pour plus de clarté, mais aucune erreur n'est jamais revenu. En effet, jusqu'à ce que j'ai mis à jour mon système à 14.04, ce code a fonctionné parfaitement (et continue à fonctionner parfaitement pour les collègues qui n'ai pas encore de mise à niveau).
Seulement maintenant sous Ubuntu 14.04, j'ai cette sortie de avconv
[h264 @ 0x98dec0] Estimating duration from bitrate, this may be inaccurate
Input #0, h264, from 'pipe:'
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h264 (Constrained Baseline), yuv420p, 640x480, 25 fps, 25 tbr, 25 tbn, 60 tbc
Output #0, mp4, to '../reel/test.mp4':
Metadata:
encoder : Lavf54.20.3
Stream #0.0: Video: libx264, yuv420p, 640x480, q=2-31, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (copy)
[mp4 @ 0x1347800] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 2 >= 2
av_interleaved_write_frame(): Invalid argument
Malgré l'erreur, out.i_dts
ne monotone augmentation sur l'ensemble de la durée de la vidéo (c'est toujours égale à in.i_pts
).
Mon hypothèse générale est que les nouvelles versions de avconv sont plus sévères avec les paramètres du flux d'entrée, de sorte que pendant que mon choix de paramètres peuvent avoir travaillé avant, maintenant elles ne fonctionnent pas.
Une autre curiosité, qui pourrait être liée, est avconv détecter que le flux est 25 FPS, même si le x264 est configuré avec une entrée FPS de 30.
Edit: Quelques informations supplémentaires, la même erreur dts (2>=2
) se produit indépendamment de l'initiale pts (avec la sortie dts correspondant comme prévu).
OriginalL'auteur Mike | 2014-05-01
Vous devez vous connecter pour publier un commentaire.
Dans un moment de "je ne sais pas pourquoi cela devrait régler le problème, mais n'", en changeant
-vcodec copy
à-vcodec libx264
(même si la source du codec était déjà libx264) fixe ladts
erreur.Avec ffmpeg, ma solution pour éviter cette erreur (que j'ai rencontré uniquement avec les fichiers mp2) est à déposer au début du fichier (c'est à dire enlever les premières millisecondes) par adjonction, à la ffmpeg en ligne de commande, de sorte que le fichier se télécharge sans les 15 premiers millième de seconde (mais il pourrait être nécessaire d'expérimenter la valeur, dans des cas individuels, comme je doute que tous les fichiers sont identiques, de sorte que la première étape serait d'augmenter la valeur de 0.015 plus grandes figure): -ss 0.015
OriginalL'auteur Mike