GVKun编程网logo

如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?

5

本篇文章给大家谈谈如何在GStreamer中在同一台计算机上工作的2个python脚本之间流式传输音频?,同时本文还将给你拓展gstcam开发(ROS+gstreamer)、Gstreamer1.18

本篇文章给大家谈谈如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?,同时本文还将给你拓展gstcam开发(ROS+gstreamer)、Gstreamer 1.18 硬件解码时如何访问GPU数据、GStreamer Android Android 安装过程:艰苦奋斗,这个没有...生...那个太旧...升... 有的不见了...查...码字:拼命地打,打,打...、GStreamer android教程不起作用等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?

如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?

如何解决如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?

到目前为止,我有 2 段代码可以正常工作。代码 A (FileRecord) 创建一个管道并将它从麦克风听到的任何内容写入名为 file.ogg 的 .ogg 文件。代码 B (FilePlayer) 必须在用户停止手动 (Ctrl + C) 脚本 A 的执行后启动,并在执行期间记录的任何记录器 (file.ogg) 中在脉冲接收器(用户的耳机)中播放。

我的目标是让两段代码同时工作,并在代码 A 记录的同时播放代码 B 中的文件。

代码 A(文件记录)

  1. from time import sleep
  2. import gi
  3. gi.require_version("Gst","1.0")
  4. from gi.repository import Gst
  5. from gi.repository import GLib
  6. import signal
  7. signal.signal(signal.SIGTSTP,signal.SIG_IGN) #When Ctrl + Z is pressed file is not playable (this command ignores Ctrl + Z)
  8. print("In order to stop press: Ctrl C.")
  9. Gst.init()
  10. main_loop = GLib.MainLoop()
  11. main_loop_thread = Thread(target = main_loop.run)
  12. main_loop_thread.start()
  13. #buffer = gst_buffer_new ()
  14. pipeline = Gst.parse_launch(''autoaudiosrc ! audioconvert ! tee name="source" ! queue ! vorbisenc ! oggmux ! filesink location=file.ogg'')
  15. pipeline.set_state(Gst.State.PLAYING)
  16. try:
  17. while True:
  18. sleep(0.1)
  19. except KeyboardInterrupt:
  20. pass
  21. pipeline.set_state(Gst.State.NULL)
  22. main_loop.quit()
  23. main_loop_thread.join()

代码 B(文件播放器)

  1. from time import sleep
  2. import gi
  3. gi.require_version("Gst","1.0")
  4. from gi.repository import Gst
  5. from gi.repository import GLib
  6. import signal
  7. Gst.init()
  8. main_loop = GLib.MainLoop()
  9. main_loop_thread = Thread(target = main_loop.run)
  10. main_loop_thread.start()
  11. pipeline = Gst.parse_launch(''filesrc location=file.ogg ! decodebin ! pulsesink'')
  12. pipeline.set_state(Gst.State.PLAYING)
  13. try:
  14. while True:
  15. sleep(0.1)
  16. except KeyboardInterrupt:
  17. pass
  18. pipeline.set_state(Gst.State.NULL)
  19. main_loop.quit()
  20. main_loop_thread.join()

我不知道如何实现声音流。请帮帮我!

gstcam开发(ROS+gstreamer)

gstcam开发(ROS+gstreamer)

写在前面

gstcam是github上一个开元的ros软件包,它巧妙地将gstream流媒体框架引入ROS系统。通过利用 gstreamer 实现一个标准的ROS API接口.比如捕获usb uav camera 的图像,然后转化成 ros中 sensor_msgs/Image类型的image话题,发布到ros中,供其他节点使用。

gscam_github
gscam_wiki
这里注意区别在ros中处理图像的其他的几种方式
opencv + ros 实现采集图像发布成话题
web_video_server功能包的使用 实现把话题传到网络



web_video_server功能包的主要功能是,在ROS系统中,比如某些话题发布了图像、视频的话题,通过这个功能包可以订阅这些话题,然后对图像压缩,通过网络传输出去,这样我们就可以通过网络的方式获取到这些图像和话题。

概述 gscam软件工作流程

gscam 首先在launch文件中,通过参数gstcam_config设置一条gstreamer pipeline :

v4l2src device=$(arg DEVICE) ! video/x-raw-rgb,framerate=$(arg FPS) ! ffmpegcolorspace

其实这条pipeline还不完整,只有两个Elements, 一个是从设备中获取图像的v4l2src, 还有一个是颜色空间转换的ffmpegcolorspace,中间的那个是输入到ffmpegcolorspace的格式设定,最基本的其实还缺少一个sink Element, 所以gscam主要就在这里做文章,它在程序中创建了一个appsink Element,然后添加到pipeline中。
在gstreamer中,appsrc、appsink这两个element及其重要,通过他们可以在pipeline中调用第三方的代码。gscam就是通过使用appsink, 创建了一个缓存队列buffer, 通过对内存中的这个buffer拷贝、转换成sensor_msgs/Image的。

源码分析

gscam.cpp 定义类  gscam.h 声明类  gscam_node.cpp创建对象,创建节点调用方法

//GSCam::configure()
//这些主要是获取 launch中的一些参数。
    if (!gsconfig_env && !gsconfig_rosparam_defined) {
      ROS_FATAL( "Problem getting GSCAM_CONFIG environment variable and ''gscam_config'' rosparam is not set. This is needed to set up a gstreamer pipeline." );
      return false;
    } else if(gsconfig_env && gsconfig_rosparam_defined) {
      ROS_FATAL( "Both GSCAM_CONFIG environment variable and ''gscam_config'' rosparam are set. Please only define one." );
      return false;
    } else if(gsconfig_env) {
      gsconfig_ = gsconfig_env;
      ROS_INFO_STREAM("Using gstreamer config from env: \""<<gsconfig_env<<"\"");
    } else if(gsconfig_rosparam_defined) {
      gsconfig_ = gsconfig_rosparam;
      ROS_INFO_STREAM("Using gstreamer config from rosparam: \""<<gsconfig_rosparam<<"\"");
    }

//  bool GSCam::init_stream()
//这里是gstreamer的一些常规操作
gst_init(0,0);
//创建 appsink element
sink_ = gst_element_factory_make("appsink",NULL);
gst_app_sink_set_caps(GST_APP_SINK(sink_), caps);
//set_caps of appsink 就是指定格式,这一块写的很地道,值得借鉴
gst_caps_unref(caps);

gst_bin_add(GST_BIN(pipeline_), sink_)
gst_element_link(outelement, sink_)

//gstreamer管道好像需要时钟,这里可用选ros的 或者 gstreamer的
ros::Time now = ros::Time::now();
GstClockTime ct = gst_clock_get_time(clock);

//创建ROS 发布者
jpeg_pub_ = nh_.advertise<sensor_msgs::CompressedImage>("camera/image_raw/compressed",1);
cinfo_pub_ = nh_.advertise<sensor_msgs::CameraInfo>("camera/camera_info",1);
//根据image_encoding的方式不同,发布的话题也稍微不同
camera_pub_ = image_transport_.advertiseCamera("camera/image_raw", 1);

void GSCam::publish_stream()

//先启动流
gst_element_set_state(pipeline_, GST_STATE_PLAYING)
//然后在while(ros::ok)循环中
//取样
GstSample* sample = gst_app_sink_pull_sample(GST_APP_SINK(sink_));
//得到缓存buffer
GstBuffer* buf = gst_sample_get_buffer(sample);
GstMemory *memory = gst_buffer_get_memory(buf, 0)
//访问内存中数据
gst_memory_map(memory, &info, GST_MAP_READ);

//数据转换
std::copy(buf_data, (buf_data)+(buf_size),img->data.begin());

//数据封装
img->header = cinfo->header;
img->format = "jpeg";
img->data.resize(buf_size);

//发布
jpeg_pub_.publish(img);
cinfo_pub_.publish(cinfo);

//这里gstreamer支持了好几种编码方式,所以这个地方显得有点杂,但大致思路是一样的

//run 就是对方法的调用,gscam_node主要就是调用这个方法
this->configure()
this->init_stream()
this->publish_stream();//大循环
 this->cleanup_stream();

gscam_cmakelist分析

//gscam的CmakeList写的也很优秀,前面我的一篇博客专门分析过
find_package(PkgConfig)

pkg_check_modules(GSTREAMER QUIET gstreamer-0.10)
if(NOT GSTREAMER_FOUND)
  set(GSTREAMER_VERSION_1_x TRUE)
endif()
if(GSTREAMER_VERSION_1_x)
  message(STATUS "gst 1.0")
  pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0)
  pkg_check_modules(GST_APP REQUIRED gstreamer-app-1.0)
else()
  message(STATUS "gst 0.1")
  pkg_check_modules(GSTREAMER REQUIRED gstreamer-0.10)
  pkg_check_modules(GST_APP REQUIRED gstreamer-app-0.10)
endif()

总结

通过对gscam的学习,确实对ros以及在ros中对图像的操作有了一定的了解,我在gscam的基础之上也做了一些延伸和拓展,gscam只是把USB camera的图像拿到,转化成topic, 我想在这里有一个数据共享,一方面转化成topic供其他node使用,同时丰富一下这个pipiline,让图像还能通过网络发送出去。

  • 点赞 1
  • 收藏
  • 分享
    • 文章举报
一銤阳光
发布了204 篇原创文章 · 获赞 199 · 访问量 57万+
他的留言板 关注

Gstreamer 1.18 硬件解码时如何访问GPU数据

Gstreamer 1.18 硬件解码时如何访问GPU数据

如何解决Gstreamer 1.18 硬件解码时如何访问GPU数据?

嗨,我目前在 gstreamer 1.18 中创建自定义 python 插件时遇到了麻烦。我正在努力从从 nvida 硬件解码元素 (nvh264dec) 发送的缓冲区访问 GPU 内存。

这是一个 gst-launch 管道,显示了我在做什么:

gst-launch-1.0 -v filesrc location=VIDEO ! qtdemux ! h264parse ! nvh264dec ! <custom-element> ! fakesink

<custom-element> 内,我希望从 nvh264dec 发送的缓冲区内访问 gpu 数据。但是目前,经过多次实验,我一直无法访问 gpu 数据。相反,当我尝试访问数据时,我似乎只是在主机上获得了一个缓冲区。我假设这是由于从 nvh264dec 元素输出的缓冲区的功能,即数据“根据需要”发送到主机。我相信我当前的问题是,当我尝试从 <custom-element 中的链函数中访问缓冲区数据时,出于某种原因,它是主机上包含数据的缓冲区。那么我的问题是,如何从我的自定义元素的链函数中访问缓冲区的 gpu 数据。

预先感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

GStreamer Android Android 安装过程:艰苦奋斗,这个没有...生...那个太旧...升... 有的不见了...查...码字:拼命地打,打,打...

GStreamer Android Android 安装过程:艰苦奋斗,这个没有...生...那个太旧...升... 有的不见了...查...码字:拼命地打,打,打...

0. 为什么玩 GStreamer ?

GStreamer android教程不起作用

GStreamer android教程不起作用

我在android上配置了gstreamer. gstreamer sdk工具包中的gst-sdk文件夹中有内置教程.但不知怎的,我无法建立它们.教程1工作正常.但是当我构建其他四个教程时,日食会被绞死.有没有人对此有任何想法?基本上我想使用gstreamer在eclipse中生成一个媒体播放器.

解决方法:

你能尝试以下几点:

>首先,在JNI文件夹中的Android.mk的开头和结尾添加“ifdef BUILD_PROJECT”和“endif”.
>接下来,为构建命令添加一个选项:“ndk-build BUILD_PROJECT = 1”([属性] – > [C/C++构建] – > [构建命令])

我想这个问题是与CDT相关的线程或进程同步…也许.
至少,我可以在上述设置之后构建教程2-5(其他设置是默认设置),没有任何问题.

祝好运 !

关于如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于gstcam开发(ROS+gstreamer)、Gstreamer 1.18 硬件解码时如何访问GPU数据、GStreamer Android Android 安装过程:艰苦奋斗,这个没有...生...那个太旧...升... 有的不见了...查...码字:拼命地打,打,打...、GStreamer android教程不起作用的相关信息,请在本站寻找。

本文标签: