2

我正在尝试构建一个 Libjitsi 音频会议组件以集成到更大的小程序中,从 org.jitsi.examples.AVReceive2 和 *.AVTransmit2 作为模板开始。我在一台计算机上启动并正常运行了这些示例,但在我尝试过的每台其他计算机上,我在初始化 MediaDevices 时不断收到错误消息。以下是 AVReceive2 的相关代码片段:

private final int localPortBase;
private MediaStream[] mediaStreams;
private final InetAddress remoteAddr;
private final int remotePortBase;

public AudioTranceiver(int localPortBase, String remoteHost, int remotePortBase) {

    this.localPortBase = localPortBase;
    this.remoteAddr = InetAddress.getByName(remoteHost);
    this.remotePortBase = remotePortBase;
}

public String start() {
    MediaType mediaType = MediaType.AUDIO;
    MediaService mediaService = LibJitsi.getMediaService();
    int localPort = localPortBase;
    int remotePort = remotePortBase;

    mediaStreams = new MediaStream[1];
    for(MediaDevice audio : mediaService.getDevices(mediaType, MediaUseCase.ANY)) {
        System.out.println(audio.toString() + "\n");
    }
    try {
        MediaDevice device
            = mediaService.getDefaultDevice(mediaType, MediaUseCase.CALL);
        MediaStream mediaStream = mediaService.createMediaStream(device);

        mediaStream.setDirection(MediaDirection.RECVONLY);
......
......

此代码生成一个巨大的日志。我已经在“工作”和“非工作”系统上逐行检查了它,除了最后之外没有发现任何明显的日志差异。在一台计算机上,即代码正常工作的计算机上,初始化以以下内容结束:

Oct 29, 2015 3:08:53 PM org.jitsi.util.Logger info
INFO: Initializing audio devices
Oct 29, 2015 3:08:53 PM org.jitsi.util.Logger info
INFO: Initializing video devices
Oct 29, 2015 3:08:54 PM org.jitsi.util.Logger info
INFO: Support for the formats of camera 'Lenovo EasyCamera': [AVFRAME, class org.jitsi.impl.neomedia.codec.video.AVFrame, pixFmt 1, deviceSystemPixFmt 0x32595559]
Oct 29, 2015 3:08:54 PM org.jitsi.util.Logger info
INFO: Looking for configured audio devices.
Oct 29, 2015 3:08:54 PM org.jitsi.util.Logger info
INFO: Scanning for configured Video Devices.
Oct 29, 2015 3:08:54 PM org.jitsi.util.Logger info
INFO: Found Lenovo EasyCamera as a AVFRAME, class org.jitsi.impl.neomedia.codec.video.AVFrame video capture device.
Oct 29, 2015 3:08:56 PM org.jitsi.util.Logger info
INFO: GatherEntropy got: 88200 bytes

此时,计算机将成功接收到传入的 RTP 音频流。在我的其他设备上,我收到一个错误,它崩溃如下:

Oct 29, 2015 2:58:12 PM org.jitsi.util.Logger info
INFO: Initializing audio devices
Oct 29, 2015 2:58:12 PM org.jitsi.util.Logger info
INFO: Initializing video devices
Oct 29, 2015 2:58:12 PM org.jitsi.util.Logger info


INFO: Looking for configured audio devices.
Oct 29, 2015 2:58:12 PM org.jitsi.util.Logger info
INFO: Scanning for configured Video Devices.
Oct 29, 2015 2:58:12 PM org.jitsi.util.Logger info
INFO: Found Desktop Streaming 0 as a AVFRAME, class org.jitsi.impl.neomedia.codec.video.AVFrame video capture device.
java.lang.IllegalArgumentException: direction
    at org.jitsi.service.neomedia.AbstractMediaStream.assertDirection(AbstractMediaStream.java:101)
    at org.jitsi.impl.neomedia.MediaStreamImpl.setDirection(MediaStreamImpl.java:2496)
    at org.jitsi.examples.AVReceive2.initialize(AVReceive2.java:131)
    at org.jitsi.examples.AVReceive2.main(AVReceive2.java:349)
    at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我已经确定错误是由 mediaStream.setDirection(MediaDirection.RECVONLY) 调用引发的,并试图围绕该元素进行调试。

四点:

  1. 我修改了 AVReceiver 代码以在 setDirection() 调用之前吐出 MediaDevice 的 toString() 。在工作计算机上,我得到:

麦克风(Realtek 高保真音频):wasapi:{0.0.1.00000000}.{8941227a-5fac-4416-b31b-728eb2665a82 LINEAR, 48000.0 Hz, 16-bit, Mono, LittleEndian, Signed

线性、48000.0 Hz、16 位、立体声、LittleEndian、有符号

线性,48000.0 Hz,8 位,单声道,有符号

线性、48000.0 Hz、8 位、立体声、有符号

线性,22050.0 Hz,16 位,单声道,LittleEndian,有符号

线性、16000.0 Hz、16 位、单声道、LittleEndian、有符号

线性、11025.0 Hz、16 位、单声道、LittleEndian、有符号

线性、8000.0 Hz、16 位、单声道、LittleEndian、有符号

在非工作设备上,我只得到一个通用的 toString() ,例如:

org.jits.impl.neomedia.device.AudioMediaDeviceImpl@131d2bf

我猜这意味着 MediaService 没有正确定位或实例化我的设备。我已经使用 MediaService.getDevice(MediaType.AUDIO,MediaUseCase.ANY) 扩展了搜索,以查看是否有其他设备并且该服务只是获得了错误的默认设备,但 Impl 类是唯一检测到的设备。

  1. 在决定使用 Libjitsi 之前,我通过 JMF 和 FMJ 前身在“工作”计算机上进行了几次参观。有可能我在我的“工作”计算机上设置了其他“非工作”系统上没有的配置,但我终生都找不到它。
  2. 我已确保所需的本机 dll 已正确放置在类路径中。两个系统都运行适合其架构的 32/64 位 dll,并且我没有收到路径或加载错误。绝对不是问题。
  3. 如果我不设置方向,我已经确定设备保持在 MediaDirection.INACTIVE 状态,这不是一个选项。

我一直在这几天,试图找到解决方案或看看是否有其他人遇到过这个问题,但没有运气。有 Libjitsi 经验的人知道是什么原因造成的吗?

万分感谢,

大卫

4

0 回答 0