我目前正在尝试将来自 Raspberry Pi 相机的实时提要转换为 H264,并使用 gstreamer 将其存储为 mp4 视频。由于我使用的是 Raspberry Pi 1,因此我需要使用硬件加速的视频编码,否则编码器无法跟上。
我尝试了以下管道,我手动输入 RGB 图像数据:
appsrc name=src format=time is-live=true caps=video/x-raw,format=(string)RGB,width=640,height=480,bpp=24,depth=24,framerate=20/1 ! autovideoconvert ! queue ! omxh264enc ! mp4mux ! filesink location=output.mp4
但是,它失败并显示以下输出:
0:00:01.193743067 2469 0x1f5b320 WARN autoconvert gstautoconvert.c:1048:gst_auto_convert_sink_query:<autoconvertchild> Got query allocation while no element was selected, letting through
0:00:01.205271623 2469 0x1f5b2c0 WARN omxvideoenc gstomxvideoenc.c:2944:gst_omx_video_enc_propose_allocation:<omxh264enc-omxh264enc0> allocation query does not contain caps
0:00:02.109098855 2469 0x1f5b320 WARN v4l2bufferpool gstv4l2bufferpool.c:1189:gst_v4l2_buffer_pool_dqbuf:<v4l2convert0:pool:src> Driver should never set v4l2_buffer.field to ANY
0:00:02.172643411 2469 0xa2703200 WARN GST_PADS gstpad.c:4226:gst_pad_peer_query:<omxh264enc-omxh264enc0:src> could not send sticky events
0:00:02.193615605 2469 0xa2703200 WARN omxvideoenc gstomxvideoenc.c:1602:gst_omx_video_enc_loop:<omxh264enc-omxh264enc0> error: Internal data stream error.
0:00:02.197108471 2469 0xa2703200 WARN omxvideoenc gstomxvideoenc.c:1602:gst_omx_video_enc_loop:<omxh264enc-omxh264enc0> error: stream stopped, reason not-negotiated
0:00:02.329828367 2469 0x1f7eaa0 WARN bufferpool gstbufferpool.c:1394:gst_buffer_pool_set_flushing:<v4l2convert0:pool:sink> can't change flushing state of inactive pool
0:00:02.333992206 2469 0x1f7eaa0 WARN bufferpool gstbufferpool.c:1394:gst_buffer_pool_set_flushing:<v4l2convert0:pool:sink> can't change flushing state of inactive pool
奇怪的是,如果我omxh264enc
用非加速版本替换x264enc
,它可以工作(尽管它在几帧后落后)。
我认为之前的警告Internal data stream error
可能会表明实际出了什么问题,但我无法从中理解。
完整的代码可以在这里找到:https ://pastebin.com/pgr940yu ,以及该代码的完整调试输出:https ://pastebin.com/CLwAfxMG 。
提前非常感谢!
最好的,霍曼