首页
学习
活动
专区
工具
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
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片

    对于大家经常见到和使用到的普通MP4来说,作为电影、电视文件的存储容器,是很好的,不过对于流媒体点播来说,最大的缺点就是它的媒体信息和关键帧索引都集中存放在moov box中,而导致越大的文件,moov box越大,对播放器来说,获取不到moov box,根本无从解码,所以就导致MP4文件点播,需要缓冲很久,加载头部数据。当然常见解决方案,就是文件切分,把大的MP4文件,切为小一点的MP4文件,这样每块的MP4的加载就会快很多,这个也是很多视频网站的解决方式,这样的切分也还好,分片数量不算很多。然而到了HLS时代,为了支持HLS协议,就需要把大的MP4文件,都转换为了更小的HLS-TS分片文件,这就出现问题了,服务器太多碎片一样的TS文件,难以管理,也影响性能。怎么解决呢?那就是虚拟HLS分片技术。

    013

    python从linux下载文件_python gzip

    解决 python调用OpenCV 保存视频时使用”avc1″格式出现# Could not find encoder for codec id 27: Encoder not found的错误(此错误不能保存视频文件),以及使用”mpeg”格式出现的# OpenCV: FFMPEG: tag 0x6765706d/’mpeg’ is not supported with codec id 2 and format ‘mp4 / MP4 (MPEG-4 Part 14)’ # OpenCV: FFMPEG: fallback to use tag 0x7634706d/’mp4v’错误(此错误能保存视频并且能正常播放,但是经过flask传到客户端浏览器时不能播放) 编译avc1 x264 x265 vpx aac mp3lame opus aom 等格式视频的库以及编译完编译FFmpeg教程,其中编译libaom时我编译了两边才成功 https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu 这是编译完支持各种格式的FFmpeg之后编译支持FFmpeg版的OpenCV链接 https://www.jianshu.com/p/f4ca1039eadf

    03
    领券