我有一段代码,可以获取图像流,并使用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对输入流的参数更为严格,因此虽然我选择的参数以前可能有用,但现在不起作用。
另一个可能与之相关的好奇之处是,即使x264配置为输入FPS为30,avconv仍会检测到该流为25 FPS。
编辑:一些进一步的信息,无论初始pt为何,都会发生相同的dts错误(
2>=2
)(输出dts与预期的匹配)。 最佳答案
在“我不知道为什么要修复它,但确实要解决”的片刻中,将-vcodec copy
更改为-vcodec libx264
(即使源编解码器已经是libx264)也解决了dts
错误。
关于c - 在14.04上从libx264进行管道传输时,avconv提示 "non monotonically increasing dts to muxer in stream",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23408309/