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(&params, "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(&params);

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 кадров в секунду, хотя x264 настроен на входное значение FPS, равное 30.

Изменить: некоторая дополнительная информация, одна и та же ошибка dts (2>=2) происходит независимо от начальных точек (с ожидаемым соответствием выходных dts).


person Mike    schedule 01.05.2014    source источник
comment
Я нашел этот вопрос в DDG после того, как FFMPEG выдал эту ошибку. Проблема заключалась в недопустимом файле субтитров. Одна из временных меток субтитров появилась перед предыдущей. Я только что отредактировал файл VTT в текстовом редакторе и удалил его. Недопустимый подзаголовок оказался в начале файла. Я считаю, что ошибочная отметка времени задается как x ›= x, где x — миллисекунды.   -  person Chloe    schedule 19.04.2016


Ответы (1)


В момент «я не знаю, почему это должно исправить, но делает», изменение -vcodec copy на -vcodec libx264 (хотя исходный кодек уже был libx264) исправило ошибку dts.

person Mike    schedule 09.05.2014
comment
Да, это работает. Но может быть и так, что ffmpeg теперь не просто сбрасывает поток, а еще и перекодирует его. - person lefterav; 03.08.2014
comment
С ffmpeg мой обходной путь, чтобы избежать этой ошибки (с которой я столкнулся только с файлами mp2), состоит в том, чтобы удалить начало файла (т.е. удалить первые несколько миллисекунд), добавив следующее в командную строку ffmpeg, чтобы файл закачки без первых 15 тысячных секунды (но возможно придется поэкспериментировать со значением, в отдельных случаях, так как сомневаюсь, что все файлы будут идентичными, поэтому первым шагом будет увеличение значения с 0,015 до какой-то большей цифры ): -сс 0,015 - person Ed999; 27.04.2017