avconv жалуется на "не монотонное увеличение dts для мультиплексора в потоке" при передаче из libx264 14.04
У меня есть кусок кода, который берет поток изображений и записывает их в файл, используя x264 для кодирования и avconv. Соответствующие биты следующие
// 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);
Я упустил проверку ошибок для ясности, но никакой ошибки не возвращается. Действительно, до тех пор, пока я не обновил свою систему до 14.04, этот код работал отлично (и продолжает отлично работать для коллег, которые еще не обновились).
Только сейчас, когда работает Ubuntu 14.04, я получаю этот вывод из 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
Несмотря на ошибку, out.i_dts
монотонно увеличивается на протяжении всего видео (оно всегда равно in.i_pts
).
Мое общее предположение состоит в том, что более новые версии avconv более строги с параметрами входного потока, поэтому, хотя мой выбор параметров мог работать раньше, они не работают сейчас.
Другим любопытным фактом, который может быть связан, является обнаружение avconv того, что поток составляет 25 FPS, хотя x264 настроен с входным FPS 30.
Редактировать: некоторая дополнительная информация, та же ошибка DTS (2>=2
) происходит независимо от начальных значений (с выходными значениями, соответствующими ожидаемым значениям).
1 ответ
В момент "я не знаю, почему это должно это исправить, но делает", меняя -vcodec copy
в -vcodec libx264
(хотя исходный кодек уже был libx264) исправил dts
ошибка.