首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过appsrc将cv::Mat保存到mp4文件时出现问题

问题描述: 在使用appsrc将cv::Mat保存到mp4文件时,遇到了一些问题。

解决方案:

  1. 确保正确设置GStreamer环境:
    • 安装GStreamer开发包和插件:sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
    • 设置GStreamer环境变量:export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/gstreamer-1.0/:$LD_LIBRARY_PATH
  • 确保正确设置OpenCV环境:
    • 确保OpenCV库已正确安装和链接。
    • 确保使用的OpenCV版本支持GStreamer插件。
  • 确保正确设置GStreamer管道:
    • 创建GStreamer管道:GstElement *pipeline = gst_pipeline_new("appsrc-pipeline");
    • 创建appsrc元素:GstElement *appsrc = gst_element_factory_make("appsrc", "appsrc");
    • 设置appsrc属性:g_object_set(G_OBJECT(appsrc), "caps", gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "BGR", NULL), NULL);
    • 创建videoconvert元素:GstElement *videoconvert = gst_element_factory_make("videoconvert", "videoconvert");
    • 创建x264enc元素:GstElement *x264enc = gst_element_factory_make("x264enc", "x264enc");
    • 创建mp4mux元素:GstElement *mp4mux = gst_element_factory_make("mp4mux", "mp4mux");
    • 创建filesink元素:GstElement *filesink = gst_element_factory_make("filesink", "filesink");
    • 设置filesink属性:g_object_set(G_OBJECT(filesink), "location", "output.mp4", NULL);
    • 将元素添加到管道中:gst_bin_add_many(GST_BIN(pipeline), appsrc, videoconvert, x264enc, mp4mux, filesink, NULL);
    • 连接元素:gst_element_link_many(appsrc, videoconvert, x264enc, mp4mux, filesink, NULL);
  • 将cv::Mat数据传递给appsrc:
    • 将cv::Mat转换为GstBuffer:GstBuffer *buffer = gst_buffer_new_wrapped_full(GST_MEMORY_FLAG_READONLY, (gpointer)mat.data, mat.total() * mat.elemSize(), 0, mat.total() * mat.elemSize(), NULL, NULL);
    • 设置appsrc的数据:g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);
  • 启动管道并保存到mp4文件:
    • 启动管道:gst_element_set_state(pipeline, GST_STATE_PLAYING);
    • 等待管道完成:gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
    • 停止管道:gst_element_set_state(pipeline, GST_STATE_NULL);
  • 销毁资源:
    • 释放GstBuffer:gst_buffer_unref(buffer);
    • 销毁管道:gst_object_unref(GST_OBJECT(pipeline));

注意事项:

  • 确保编译时链接了正确的GStreamer和OpenCV库。
  • 检查是否有足够的权限来写入目标文件。
  • 确保cv::Mat的格式与GStreamer管道中的格式匹配。

推荐的腾讯云相关产品:

  • 腾讯云视频处理(云点播):提供丰富的视频处理功能和服务,可用于视频转码、视频截图、视频水印等操作。详情请参考:https://cloud.tencent.com/product/vod
  • 腾讯云对象存储(COS):提供高可靠、低成本的对象存储服务,可用于存储和管理大规模的非结构化数据。详情请参考:https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

视频无法输出?来一键安装InVideo插件

Part1前言 在虚幻引擎程序运行时,如果画面保存为mp4文件通过InVideo插件的一个函数即搞定。本文主要介绍其实现思路。...->ReadPixels(Bitmap, FReadSurfaceDataFlags()); Part3opencv保存mp4 这里我们获取到的rgb数据,先转成cv::Mat,在通过cv::VideoWriter...::Mat img(m_ImageY,m_ImageX,CV_8UC3, (unsigned char*)m_ImageBuf); 这里需要特别注意,在生成Mat的时候需要设置为CV_8UC3格式。...文件的录制,这样最大的问题是会影响游戏的帧率,因为视频编码其实是一个非常耗费资源的事情,所以我们需要将其移植到子线程来。...continue; } Part5总结 本文主要实现了如何在运行时保存虚幻引擎的画面成mp4,考虑到视频编码对性能的消耗较大,我们整个mp4视频的保存放到了子线程中进行,这样会游戏线程的帧率几乎没有影响

46520

Qt实用技巧:使用OpenCV库操作摄像头拍照、调节参数和视频录制

原理 使用OpenCV打开摄像头(可打开USB和网路哦摄像头),渲染图像显示,可使用OpenCV属性调整摄像头的各项参数,使用拍照可以当前图片拍照,使用录像可以从当前时间点开始录像直至停止录像 注意...目前测试,即使PC上有编码器,但是OpenCV存储mat为对应的录像视频文件失败,出现: 录制完视频大小为200多B(基本为0),mp4格式(查看入坑一) 录制完视频大小为6KB,avi格式...") { // mp4目前录制不成功(可以生成文件,但是打开失败) // cvFourcc = CV_FOURCC('M','P','4','2');..._running) { return; } if(_pVideoCapture->isOpened()) { cv::Mat mat;...*_pVideoCapture >> mat; if(_showProperty) { cv::putText(mat, QString("brightness

3.8K11
  • 针对二维码解析库的 Fuzzing 测试

    Mat2Vector 一开始想着偷个懒,直接让 ChatGPT 来帮我生成代码 Mat 转成字符数组,如下所示: std::vector mat_to_vector(const cv::Mat...+ mat.total() * mat.elemSize()); return data; } 然后,原来的预料图片用 imread 读取成 cv::Mat,并用上面的函数转成 vector...并保存到磁盘中,形成新的预料,这样在变异的时候可以直接变异并生成 cv::Mat: int fuzz_buf(unsigned char *buf, size_t size) { // Mat src...我们的目标是创建一个代表二维码图片的 Mat,最好是能够保存到磁盘中并从磁盘读取,方便我们使用 afl-fuzz 指定语料并进行 fuzz。...解决方案可以通过 C++ 直接去生成二维码,然后二维码直接转成 cv::Mat 去作为输入。这样一方面可以节省掉 PNG 编解码的过程,另一方面也可以摆脱 Python 的依赖。

    37641

    讲解undefined reference to symbol ‘_ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayE

    我们可以通过在编译添加-lopencv_core选项来链接核心库文件。...然后,通过调用imwrite函数图像保存为名为output.jpg的文件。 编译和链接这段代码,你需要确保正确地链接OpenCV库文件。...imwrite函数是OpenCV图像处理库中的一个函数,用于图像保存到文件。...imwrite函数返回一个布尔值,表示图像是否成功保存到文件。如果保存成功,则返回true;如果保存失败,则返回false。 总结: imwrite函数是OpenCV中用于图像保存为文件的函数。...它接受图像数据和保存文件文件名作为参数,并可选地提供保存选项。通过使用这个函数,可以轻松处理过的图像保存到文件中,以便后续的使用和分析。

    45710

    OpenCV | 基于Android系统详析Mat与Bitmap对象(创建、初始化、使用与转换 | 附大量demo)

    Mat对象 Mat是OpenCV中用来存储图像信息的内存对象; 当通过Imgcodecs.imread()方法从文件读入一个图像文件,imread方法就会返回Mat对象实例; 或者通过Utils.bitmatToMat...---- 1.1 加载图片与读取基本信息 从Android系统中选择一张图像,可以使用如下代码图像文件加载为Mat对象: Mat src = Imgcodecs.imread(fileUri.getPath...当调用imread函数, 如果只使用文件路径参数读入加载一张图像,则默认值是三通道的CV_8UC3,图像深度为CV_8U, 其中: CV表示计算机视觉; 8表示八位; UC表示无符号char;...2)通过ones、eye、zeros方法初始化创建: Mat m3 = Mat.eye(3, 3,CvType.CV_8UC3); Mat m4 = Mat.eye(new Size(3, 3),CvType.CV...中表示图像的内存容器; ---- 4.1 Mat与Bitmap相互转换 第一种情况: 通过图像对象通道,即OpenCV的imread()读取得到Mat对象; 或者通过Mat类初始化创建的Mat对象; 这样的

    6.9K63

    X is not a member of cv异常解决

    解决'X is not a member of 'cv''异常问题在使用OpenCV进行图像处理,有时候会遇到类似于"'X is not a member of 'cv'"的异常错误。...通过仔细检查代码并进行调试,可能会发现并纠正这些错误。当使用OpenCV库进行图像处理,我们可以展示一个实际应用场景并给出相应的示例代码。...-1; } // 图像转换为灰度图像 cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);...最后,我们使用cv::imwrite()函数灰度图像保存到output.jpg文件中。如果保存成功,将会显示保存成功的消息。...在确认版本兼容性、引用正确的头文件、使用正确的命名空间、清除缓存并重新编译以及排除拼写错误和语法错误等方面进行检查和调试。通过这些步骤,我们可以解决这个异常问题,并成功运行OpenCV代码。

    58710

    【从零学习OpenCV】 视频数据的读取&摄像头的直接调用

    01 视频数据的读取 虽然视频文件是由多张图片组成的,但是imread()函数并不能直接读取视频文件,需要由专门的视频读取函数进行视频读取,并将每一帧图像保存到Mat类矩阵中,代码清单2-27中给出了...VideoCapture类在读取视频文件的构造方式。...通过构造函数只是视频文件加载到了VideoCapture类变量中,当我们需要使用视频中的图像,还需要将图像由VideoCapture类变量里导出到Mat类变量里,用于后期数据处理,该操作可以通过“>...>”运算符图像按照视频顺序由VideoCapture类变量复制给Mat类变量。...并且读取视频VideoCapture类具有的属性同样可以使用。我们代码清单2-28中的视频文件改成摄像头ID(0),再次运行代码清单2-28的程序,运行结果如图2-7所示。 ? ?

    2.2K20

    解决OpenCV Error: Assertion failed (ssize.width > 0 && ssize.height > 0) in cv::re

    在本篇文章中,我介绍一些可能导致这个错误的原因,并提供一些解决方法。1. 图像尺寸错误一种常见的原因是,在调用​​cv::resize​​函数,输入图像的尺寸出现问题。...可能的原因包括:图像加载失败:在调用​​cv::imread​​函数,图像可能没能成功加载,导致图像尺寸为0。我们可以通过检查图像对象是否为空来验证是否成功加载了图像。...错误的图像路径:在调用​​cv::imread​​函数,可能提供了错误的图像路径,导致图像加载失败。我们应该确保路径是正确的。图像数据损坏:在某些情况下,图像文件可能损坏或格式不正确,导致加载失败。...我们可以通过调用​​cv::Mat::type()​​函数来检查图像的数据类型,并使用​​cv::Mat::convertTo​​函数将其转换为正确的数据类型。3....我们可以通过调用​​cv::Mat::channels()​​函数来检查图像的通道数,并根据需要使用​​cv::cvtColor​​函数将其转换为正确的通道数。4.

    1K30

    C#使用OpenCV剪切图片中的人物头像

    然后使用Nuget搜索【Emgu.CV】,如下图。 ? 这里的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows。...然后文件加入进项目,并修改属性,让xml文件输出到启动目录,如下图。 ? 使用OPenCV剪切人脸部分 现在,我们进入项目,进行OPenCV的调用。...函数里,我们先使用CascadeClassifier类读取haarcascade_frontalface_default.xml文件,建立人脸检测的对象。 再使用Mat类来导入图片(灰度模式)。...最后通过Bitmap类把识别出来的人脸进行剪切保存。...代码中默认把剪切的图片保存到Debug文件夹下,我们打开Debug文件夹,如下图: ? 因为我选中的图片只有一个人脸,所以得到一个剪切图片——Face_1.png。 原图与剪切后的图片对比如下: ?

    1.2K10

    cv2.VideoWriter()

    文件后缀名我们一般都知道视频文件是 .mp4、.3gp、.rmvb 等等格式的,但一个文件取这样的后缀名是为了告诉用户或者操作系统,它的内容是什么格式的。...我们也可以 rmvb 格式的文件取名为 ***.avi。后缀的目的是为了方便用专业的工具或者软件操作它们。2. 文件格式我们可以一个视频文件看做一个容器。简单地说就是可以看做是一个盒子。...不同的文件格式如 mp4、avi、mkv 等等,它们存放 打包数据的方式不一样,文件内部文件编码方式也可能不一样。3. 编码格式视频容器中,一般有视频和音频数据,它们采取的编码方式不一样。...fps 越高,细节越好,体验也越好,但是文件容量也越高。VideoWriter用 OpenCV 保存视频非常简单,通过调用它的 VideoWriter 这个类就好了。...如果需要读取视频文件,那么就将 VideoCapture 指定文件路径。如果,图片序列合成为视频文件,其实原理也一样,一张一张读取,然后写到 VideoWriter 当中去。

    3.9K10

    OpenCV 用 VideoWriter 创建视频(Python 版本)

    文件后缀名 我们一般都知道视频文件是 .mp4、.3gp、.rmvb 等等格式的,但一个文件取这样的后缀名是为了告诉用户或者操作系统,它的内容是什么格式的。...我们也可以 rmvb 格式的文件取名为 ***.avi。后缀的目的是为了方便用专业的工具或者软件操作它们。 2. 文件格式 我们可以一个视频文件看做一个容器。 简单地说就是可以看做是一个盒子。...不同的文件格式如 mp4、avi、mkv 等等,它们存放 打包数据的方式不一样,文件内部文件编码方式也可能不一样。 3. 编码格式 视频容器中,一般有视频和音频数据,它们采取的编码方式不一样。...fps 越高,细节越好,体验也越好,但是文件容量也越高。 VideoWriter 用 OpenCV 保存视频非常简单,通过调用它的 VideoWriter 这个类就好了。...() out.release() cv2.destroyAllWindows() 这段代码的目的就是获取摄像头的视频流,然后保存到本地,帧率是 20fps,尺寸是 1920x1080.

    16.8K30

    机器学习_分类_KNN_EM

    机器学习_分类_KNN_EM K最近邻(kNN,k-NearestNeighbor)分类算法 在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离...4)该算法在分类时有个主要的不足是,当样本不平衡,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本,该样本的K个邻居中大容量类的样本占多数。...= pow(point1.pixVal - point2.pixVal, 2); return sqrt(sum); } //计算每个点到离它最近的簇中心点,结果保存到...clusteredMat(rows, cols, CV_8UC3); clusteredMat.setTo(Scalar::all(0)); Mat pixels(...clusteredMat(rows, cols, CV_8UC3); clusteredMat.setTo(Scalar::all(0)); Mat pixels(

    25810
    领券