Jitsi - 在通话过程中播放WAV文件 - 如果可能,请混合音频

时间:2014-03-26 09:20:43

标签: java file audio device jitsi

我正在调整Jitsi,以便在正在进行通话时播放Wav文件。

我在做这件事时遇到了麻烦,如果你能帮助我,我将不胜感激。

我可以在调用开始之前切换数据源,方法是使用自定义的AudioFileMediaDevice并在CallPeerMediaHandler中打开它。

但是我在调​​用正在进行时更换数据源时遇到了问题。

=============================================== ==============

我已尝试过以下操作,但无法使其正常工作。

1)我尝试获取设备的输出数据源,并使用addInDataSource方法添加了wav文件的URLDatasource。没有工作。

DataSource dataSource = device.createOutputDataSource();

DataSource fileDataSource = Manager.createDataSource(new URL("file://resources/sounds/Sample.wav"));
((AudioMixingPushBufferDataSource)dataSource).addInDataSource(fileDataSource);

2)我尝试添加自定义Capture设备并进行切换,但它也不能正常工作:

CaptureDeviceInfo2 fileDevice =
                new CaptureDeviceInfo2("Recorded Audio 1",
                    fileDataSource.getLocator(), null, null, null, null);

            ((MediaServiceImpl) LibJitsi.getMediaService())
                .getDeviceConfiguration().getAudioSystem().setDevice(AudioSystem.DataFlow.CAPTURE, fileDevice, false);

这适用于播放,而不是捕捉设备。

3)我甚至尝试添加一个新的音频系统,将播放设备作为文件数据源,但那也不行。

=============================================== ==============

我是libjitsi的新手,所以我很难尝试解码正在发生的事情。 关于如何解决这个问题的任何指示都会很棒。

2 个答案:

答案 0 :(得分:0)

我使用以下代码调用了播放声音:

public void startPlaying(CallPeer callPeer, DataSource soundDataSource) throws OperationFailedException {
    assert callPeer instanceof CallPeerSipImpl;
    CallPeerSipImpl cp = (CallPeerSipImpl) callPeer;
    AudioMediaStreamImpl audioMediaStream = (AudioMediaStreamImpl) cp.getMediaHandler().getStream(MediaType.AUDIO);
    AudioMediaDeviceSession deviceSession = audioMediaStream.getDeviceSession();
    assert deviceSession != null;
    assert deviceSession.getDevice() instanceof AudioMixerMediaDevice;
    AudioMixerMediaDevice dev = (AudioMixerMediaDevice) deviceSession.getDevice();
    dev.getAudioMixer().addInDataSource(soundDataSource);
}

请注意,AudioMixerMediaDevice.getAudioMixer()在libjitsi中具有私有访问权限,因此我将其公开并重新编译。

答案 1 :(得分:0)

我需要在通话过程中播放音频文件,但只能在通话的远程端播放。所以我用stokitos示例玩了一下,并根据我的需要进行了修改。如果有人需要它,我就是这样做的:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int count = 0;
    char *str;
    char tmp;

    str = malloc(sizeof(char));

    while (tmp != '\n') {
        tmp = getchar();

        str = realloc(str, (count + 1) * sizeof(char));

        *(str + count) = tmp;

        count += 1;

    }

    *(str + count) = '\0';

    puts(str);

    // This is just to try and see what was happening
    for (int i = 0; i <= count; i++)
        printf("str[%d] = %c\n", i, str[i]);

    free(str);
    str = NULL;

    return EXIT_SUCCESS;

}

注意:我起诉反射来获取私有的AudioMixer对象。我承认这不是最干净的方法,但它确实有效。 :)