工具与软件:
你好
我想使用硬件加速器来创建视频。
我正在基于 AM62A7 SDK 10.00的定制 Linux 电路板上开发。
我的目标是从摄像头模块捕获帧、单独存储这些帧、然后将其合并到视频中。
目前、我正在使用 CV::VideoWriter、但我想利用硬件加速来减少 CPU 的使用。
我使用以下 GStreamer 流水线将帧捕获为 CV::Mat、而不是 CV::VideoWriter、而是逐帧存储它们、并以这种方式推动它们。
GstElement* pipeline = gst_parse_launch(
"v4l2src device=/dev/video3 io-mode=5 ! "
"video/x-raw,format=UYVY,width=1920,height=1080,framerate=30/1 ! tiovxmemalloc pool-size=8 ! "
"appsink name=sink emit-signals=True sync=True max-buffers=30 drop=False",
nullptr);
cv::cvtColor(uyvy_img, img_bgr, cv::COLOR_YUV2BGR_UYVY);
pipeline = gst_parse_launch(
"appsrc name=mysource ! "
"video/x-raw, format=NV12, width=1920, height=1080 framrate=7/1 ! "
"v4l2h264enc ! h264parse ! avimux ! filesink location=/output.avi"
, nullptr);
appsrc = gst_bin_get_by_name(GST_BIN(pipeline), "mysource");
gst_element_set_state(pipeline, GST_STATE_PLAYING);
caps = gst_caps_new_simple(
"video/x-raw",
"format", G_TYPE_STRING, "NV12",
"width", G_TYPE_INT, 1920,
"height", G_TYPE_INT, 1080,
"framerate", GST_TYPE_FRACTION, 7, 1,
"interlace-mode", G_TYPE_STRING, "progressive",
"colorimetry", G_TYPE_STRING, "bt709",
nullptr);
gst_app_src_set_caps(GST_APP_SRC(appsrc), caps);
for(int i=0;i<frames.size();i++){
cv::Mat yuv_image;
yuv_image = convertBGRtoNV12(frames[i]);
buffer = gst_buffer_new_allocate(nullptr, yuv_image.total() * yuv_image.elemSize(), nullptr);
gst_buffer_map(buffer, &map, GST_MAP_WRITE);
memcpy(map.data, yuv_image.data, yuv_image.total() * yuv_image.elemSize());
gst_buffer_unmap(buffer, &map);
gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer);
this_thread::yield();
// this_thread::sleep_for(chrono::milliseconds(10));
}
虽然运行正常、但在检查 perf_stats 时我观察到 CPU 使用情况没有变化、并且 HWA 统计信息中不显示任何内容。
谢谢你