如何将输入的音频流写入另一个流?

时间:2019-10-01 20:35:10

标签: libvlc libvlcsharp

我正在尝试将音频从Windows主机上的默认麦克风流传输到Docker容器。通过虚拟化层安装设备可能会出现问题。我无法弄清楚如何正确使用C#(dotnet核心)代码中的传入流。

我正在使用VLC Windows应用程序按照说明here在Windows主机上创建测试流。我正在流式传输到rtp://127.0.0.1:5004,因为所有内容都将在同一台计算机上运行。在我的自定义C#应用中使用流的代码如下:

LibVLC libvlc = new LibVLC(); 
libvlc.SetLogFile("c:\\temp\\vlc.log");
MediaPlayer player = new MediaPlayer(libvlc);
var media = new Media(libvlc, "rtp://127.0.0.1:5004", FromType.FromLocation);
var status = await media.Parse(MediaParseOptions.ParseNetwork);

player.Playing += (sender, e) =>
{
    //Need to do something here?
};

player.Play(media);

我期望做的是在MediaPlayer,Media或其他VLC对象上注册一些事件处理程序,并获得音频字节的缓冲区,我可以将其转换为预期的格式(PCM,1通道,16K样本/秒) ,每个样本16位),然后重写到另一个流(为简单起见,代码中未显示)。但是,我显然缺少了一些东西。

因此,我的问题是:对于我的情况,我是否应该首选来自主机的HTTP,RTSP或RTP流?一旦我正确设置了该设置,如何注册传入的音频事件,以便我可以对其进行处理并将数据写入另一个流?

1 个答案:

答案 0 :(得分:0)

检出MediaPlayer.SetAudioFormatCallback方法。

但是请注意,libvlc可以使用诸如p

之类的媒体选项为您处理流式传输。
media.AddOption(":sout=#rtp{sdp=rtp://127.0.0.1:5004}");
media.AddOption(":sout-keep");

请参阅https://wiki.videolan.org/VLC_command-line_help

上的选项列表
  

我应该首选来自主机的HTTP,RTSP或RTP流吗?

您可能有兴趣在这里阅读更多相关信息 https://stackoverflow.com/a/4303565/4064749