gstreamerfilesink可以在命令行上工作,但不能在Java代码上工作

gstreamerfilesink可以在命令行上工作,但不能在Java代码上工作,gstreamer,gstreamer-1.0,java-gstreamer,Gstreamer,Gstreamer 1.0,Java Gstreamer,我正在尝试将音频从树莓圆周率传输到虚拟机 覆盆子圆周率有一个麦克风插入它和它的管道是一样的 so(已编辑IP/主机名信息): gst-launch-1.0-ev-alsasrc设备=plughw:1,0!音频转换!rtpL24pay!udpsink主机=xxxxx端口=xxxx VM正在运行此管道: gst-launch-1.0-ev udpsrc port=xxxx caps=“应用程序/x-rtp,媒体=(字符串)音频,时钟速率=(int)44100,编码名称=(字符串)L24,编码参数=(

我正在尝试将音频从树莓圆周率传输到虚拟机

覆盆子圆周率有一个麦克风插入它和它的管道是一样的 so(已编辑IP/主机名信息):

gst-launch-1.0-ev-alsasrc设备=plughw:1,0!音频转换!rtpL24pay!udpsink主机=xxxxx端口=xxxx

VM正在运行此管道:

gst-launch-1.0-ev udpsrc port=xxxx caps=“应用程序/x-rtp,媒体=(字符串)音频,时钟速率=(int)44100,编码名称=(字符串)L24,编码参数=(字符串)2,通道=(int)2,有效负载=(int)96,ssrc=(uint)636287891,时间戳偏移=(uint)692362821,seqnum偏移=(uint)11479”!rtpL24depay!德克宾!音频转换!韦文克!filesink location=test.wav

当我用Ctrl+C结束它时,通过命令行运行它就可以了 (与-e开关耦合),并且该文件是可读的。我想做的是, 但是,如果通过命令行保持管道在Raspberry pi上运行, 但是使用Java应用程序作为VM的管道。这个Java应用程序是 连接到REST端点“/开始”和“/停止”。“/start”启动管道 和“/stop”应该停止管道并写入文件,但当点击“/stop”端点时,文件大小为零,无法读取。我的代码在这篇文章的底部。任何关于改进管道或如何使文件可读的想法都会很好。我最初的想法是,这与我如何发送EOS信息有关,但不太确定。谢谢大家!

编辑:还忘了提到我在Docker容器中运行这个JAR文件,所以它可能与端口有关,但同样——不确定

package service.rest.controllers;
导入org.apache.logging.log4j.LogManager;
导入org.apache.logging.log4j.Logger;
导入org.freedesktop.gstreamer.*;
导入org.freedesktop.gstreamer.event.EOSEvent;
导入org.freedesktop.gstreamer.message.EOSMessage;
导入org.freedesktop.gstreamer.message.message;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入service.config.ClientSettings;
导入service.config.FileSettings;
导入service.postgres.Database;
导入service.postgres.executedDatabase;
导入java.text.simpleDataFormat;
导入java.util.Date;
//管道上运行pi@raspberrypi:
//gst-launch-1.0-ev alsasrc设备=plughw:1,0!音频转换!rtpL24pay!udpsink主机=xxxxx端口=xxxx
@RestController
公共类音频捕获控制器{
@自动连线
公共数据库;
@自动连线
数据库数据库执行器;
@自动连线
客户端设置客户端设置;
@自动连线
文件设置文件设置;
私有静态最终记录器Logger=LogManager.getLogger(AudioCaptureController.class.getName());
私有静态最终字符串startTemplate=“管道从%s开始”;
私有静态最终字符串stopTemplate=“为时间窗口%s到%s录制的文件”;
专用静态最终简化格式ft=新简化格式(“yyyy-MM-dd HH:MM:ss”);
私人管道;
私人约会开始时间;
专用int端口;
私有整数长度;
私有int-defaultRecordingDuration;
私有字符串目录;
公共音频捕获控制器(){
}
/**
*初始化GStreamer管道。
*udpsrc!rtpL24depay!decodebin!音频转换!wavenc!filesink
*/
公共void init(){
port=clientSettings.getUdp_port();
defaultLength=fileSettings.getDefault_length();
defaultRecordingDuration=fileSettings.getDefault_recording_duration();
defaultDirectory=fileSettings.getDefault_directory();
Gst.初始(“接收方”);
//创建元素
Element source=ElementFactory.make(“udpsrc”、“source”);
Element depayloader=ElementFactory.make(“rtpL24depay”、“depayloader”);
Element decoder=ElementFactory.make(“decodebin”、“decoder”);
Element converter=ElementFactory.make(“音频转换”、“转换器”);
Element编码器=ElementFactory.make(“wavenc”、“编码器”);
Element sink=ElementFactory.make(“filesink”、“sink”);
//配置元素
Caps=Caps.fromString(“应用程序/x-rtp,”+
媒体=(字符串)音频+
“时钟频率=(int)44100,”+
编码名称=(字符串)L24+
编码参数=(字符串)2+
通道=(int)2+
“有效载荷=(int)96,”+
ssrc=(uint)636287891+
时间戳偏移量=(uint)692362821+
“seqnum偏移量=(uint)11479”);
source.set(“端口”,port);
资料来源:setCaps(caps);
//生成WAV文件-**当前仅生成一个文件**
//todo:需要一种保存特定文件名的方法。可能每次都必须暂停并重新启动流。
//考虑拆分文件后处理
//无法使用multifilesink或splitmuxsink b/c没有对wav的本机支持
//https://stackoverflow.com/questions/25662392/gstreamer-multifilesink-wav-files-splitting
set(“location”,defaultDirectory+“test.wav”);
//水槽设置(“位置”、“测试波形”);
//设置管道
管道=新管道();
addMany(源、depayloader、解码器、转换器、编码器、接收器);
//连接垫
source.link(depayloader);
depayloader.link(解码器);
解码器、链路(转换器);
转换器。链路(编码器);
编码器。链路(接收器);
//在总线上处理EOS/错误/警告
总线=pipe.getBus();
总线连接((bus.EOS)gstObject->System.out.println(“EOS”+gstObject));
bus.connect((bus.ERROR)(gstObject,i,s)->System.out.println(“ERROR”+i+“”+s+“”+gstObject));
bus.connect((bus.WARNING)(gstObject,i,s)->System.out.println(“WARN