我正在寻求有关开发集成摄像头和 GStreamer 以接收实时视频和音频流的系统的指导。我的主要目标是实现视频和音频的同步接收,视频帧和音频样本的速率均为每秒60帧,确保无缝同步。具体来说,我的目标是为每个视频帧配备 44100/60 音频样本,以保持同步完整性。
此外,我的最终目标是使用C++处理OpenCV中的实时视频数据和PortAudio中的音频数据。虽然我探索了包括 GStreamer 在内的各种选项,但我尚未找到更适合捕获视频和音频帧的解决方案。
作为 GStreamer 的初学者,我尝试将相机与 GStreamer 结合起来接收实时视频和音频流。然而,由于我的经验和对GStreamer的基本了解有限,我在达到预期结果时遇到了困难。我尝试遵循一些基本教程和示例,但我很难正确实施必要的步骤。我期望成功设置系统来接收同步视频和音频流,但我在有效理解和应用这些概念方面面临挑战。结果我没能达到我想要的结果。
此外,我尝试使用提供的代码片段来读取和解码 OpenCV 的帧。尽管我尝试使其适应我的需求,但在将其与项目的其余部分集成时遇到了一些问题。
#include <gst/gst.h>
#include <gst/app/gstappsink.h>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[]) {
gst_init(&argc, &argv);
// Create pipeline
gchar *pipelineDesc = g_strdup_printf("mfvideosrc device-id=1 ! video/x-raw, format=NV12, width=1280, height=720, framerate=10000000/83333, pixel-aspect-ratio=1/1, colorimetry=1:4:0:1 ! videoconvert ! video/x-raw, format=BGR ! appsink");
GError *err = nullptr;
GstElement *pipeline = gst_parse_launch(pipelineDesc, &err);
g_free(pipelineDesc);
if (err != nullptr) {
g_printerr("Error creating pipeline: %s\n", err->message);
g_clear_error(&err);
return -1;
}
// Set pipeline to playing state
GstStateChangeReturn stateChange = gst_element_set_state(pipeline, GST_STATE_PLAYING);
if (stateChange == GST_STATE_CHANGE_FAILURE) {
g_printerr("Failed to start pipeline\n");
return -1;
}
// Main loop to read frames
GstSample *sample = nullptr;
cv::Mat frame;
GstElement *appsink = gst_bin_get_by_name(GST_BIN(pipeline), "appsink0");
while (true) {
// Pull sample from appsink
sample = gst_app_sink_pull_sample(GST_APP_SINK(appsink));
// Get buffer from sample
GstBuffer *buffer = gst_sample_get_buffer(sample);
// Map buffer to read data
GstMapInfo info;
gst_buffer_map(buffer, &info, GST_MAP_READ);
// Convert data to OpenCV Mat
frame = cv::Mat(720, 1280, CV_8UC3, info.data);
// Unmap buffer
gst_buffer_unmap(buffer, &info);
// Show frame
cv::imshow("Frame", frame);
// Wait for ESC key to exit
if (cv::waitKey(1) == 27)
break;
}
// Clean up
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(appsink);
gst_object_unref(pipeline);
cv::destroyAllWindows();
return 0;
}
任何有关实现这一目标的必要步骤的建议将不胜感激。
预先感谢您的协助。
您的直播正常吗? mfvideosrc 插件没有“device-id”参数,尝试用“device-index”替换它