avconv投诉“投诉”;流中多路复用器的非单调递增dts“;2004年4月14日从libx264开始配管时

avconv投诉“投诉”;流中多路复用器的非单调递增dts“;2004年4月14日从libx264开始配管时,c,ubuntu,x264,avconv,ubuntu-14.04,C,Ubuntu,X264,Avconv,Ubuntu 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; par

我有一段代码,它获取图像流,并使用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检测到流是25fps,即使x264配置为输入FPS为30


编辑:一些进一步的信息,相同的dts错误(
2>=2
)会发生,无论初始pts如何(输出dts与预期匹配)。

在“我不知道为什么应该修复它,但确实”的瞬间,将
-vcodec copy
更改为
-vcodec libx264
(即使源编解码器已经是libx264)修复了
dts
错误。

是的,这有效。但ffmpeg现在可能不仅仅转储流,还对其进行重新编码。使用ffmpeg,我的解决方法是通过在ffmpeg命令行中添加以下内容来删除文件的开头(即删除前几毫秒),以避免此错误(我只在mp2文件中遇到过此错误),因此,文件下载不需要前15千分之一秒(但在个别情况下,可能需要对该值进行试验,因为我怀疑所有文件都是相同的,所以第一步是将该值从0.015增加到某个更大的数字):-ss 0.015在FFMPEG给出此错误后,我在DDG中发现了这个问题。问题是字幕文件无效。其中一个字幕时间戳出现在前一个时间戳之前。我只是在文本编辑器中编辑了VTT文件并将其删除。无效的字幕恰好位于文件的开头。我相信错误的时间戳是由x>=x给出的,其中x是毫秒。