本篇文章给大家谈谈如何在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 脚本之间流式传输音频?
- gstcam开发(ROS+gstreamer)
- Gstreamer 1.18 硬件解码时如何访问GPU数据
- GStreamer Android Android 安装过程:艰苦奋斗,这个没有...生...那个太旧...升... 有的不见了...查...码字:拼命地打,打,打...
- GStreamer android教程不起作用
如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?
如何解决如何在 GStreamer 中在同一台计算机上工作的 2 个 python 脚本之间流式传输音频?
到目前为止,我有 2 段代码可以正常工作。代码 A (FileRecord) 创建一个管道并将它从麦克风听到的任何内容写入名为 file.ogg 的 .ogg 文件。代码 B (FilePlayer) 必须在用户停止手动 (Ctrl + C) 脚本 A 的执行后启动,并在执行期间记录的任何记录器 (file.ogg) 中在脉冲接收器(用户的耳机)中播放。
我的目标是让两段代码同时工作,并在代码 A 记录的同时播放代码 B 中的文件。
代码 A(文件记录)
from time import sleep
import gi
gi.require_version("Gst","1.0")
from gi.repository import Gst
from gi.repository import GLib
import signal
signal.signal(signal.SIGTSTP,signal.SIG_IGN) #When Ctrl + Z is pressed file is not playable (this command ignores Ctrl + Z)
print("In order to stop press: Ctrl C.")
Gst.init()
main_loop = GLib.MainLoop()
main_loop_thread = Thread(target = main_loop.run)
main_loop_thread.start()
#buffer = gst_buffer_new ()
pipeline = Gst.parse_launch(''autoaudiosrc ! audioconvert ! tee name="source" ! queue ! vorbisenc ! oggmux ! filesink location=file.ogg'')
pipeline.set_state(Gst.State.PLAYING)
try:
while True:
sleep(0.1)
except KeyboardInterrupt:
pass
pipeline.set_state(Gst.State.NULL)
main_loop.quit()
main_loop_thread.join()
代码 B(文件播放器)
from time import sleep
import gi
gi.require_version("Gst","1.0")
from gi.repository import Gst
from gi.repository import GLib
import signal
Gst.init()
main_loop = GLib.MainLoop()
main_loop_thread = Thread(target = main_loop.run)
main_loop_thread.start()
pipeline = Gst.parse_launch(''filesrc location=file.ogg ! decodebin ! pulsesink'')
pipeline.set_state(Gst.State.PLAYING)
try:
while True:
sleep(0.1)
except KeyboardInterrupt:
pass
pipeline.set_state(Gst.State.NULL)
main_loop.quit()
main_loop_thread.join()
我不知道如何实现声音流。请帮帮我!
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
- 收藏
- 分享
-
- 文章举报

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 安装过程:艰苦奋斗,这个没有...生...那个太旧...升... 有的不见了...查...码字:拼命地打,打,打...
0. 为什么玩 GStreamer ?
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教程不起作用的相关信息,请在本站寻找。
本文标签: