1
回答
如何重定向本地的麦克风到远程桌面?
华为云实践训练营,热门技术免费实践!>>>   

现在我要写一个工具,运行在华硕的上网本上,上网本上跑的是windows server 2003,这个工具运行的时候开启上网本的自带麦克风,监听某个端口,我在另一个计算机上连上去,然后这个工具把从麦克风获取到的音频流传到我的机器上。


目前已实现这部分功能:

1、用户登录的时候自动运行

2、本地运行OK


但是存在这些问题:

1、无法开机运行(就是用户登录前运行,并且只运行一个,不会每个用户登录都运行一次)

2、用远程桌面连接上去运行这个工具的话会找不到录音设备。


我的录音代码如下

package local;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;

public class SoundListener implements Runnable{
	
	private Resources resources ;
	
	public SoundListener(Resources resources){
		this.resources = resources ;
	}

	
	public void listen() {
        try {
            AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F, 16, 2, 4,44100F, false);//创建音频对象
            DataLine.Info info = new DataLine.Info(TargetDataLine.class,
                    audioFormat);
            TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
            targetDataLine.open(audioFormat);//打开输入设备
            targetDataLine.start();//开始录音
            int nByte = 0;
            final int bufSize=4*100;
            byte[] buffer = new byte[bufSize];
            System.out.println("start recording~~");
            while (nByte != -1) {
                nByte = targetDataLine.read(buffer, 0, bufSize);
                resources.write(buffer, 0, nByte) ;//这个是我用来输出的,可以不管
            }
            System.out.println("stop recording~~~");
//            sourceDataLine.stop();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


	@Override
	public void run() {
		// TODO Auto-generated method stub
		listen() ;
	}
}


然后,本地登录运行是没有问题的,但是远程桌面连上去运行的话就会报出如下异常


java.lang.IllegalArgumentException: No line matching interface TargetDataLine su pporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-end ian is supported. at javax.sound.sampled.AudioSystem.getLine(Unknown Source) at local.SoundListener.listen(SoundListener.java:24) at local.SoundListener.run(SoundListener.java:47) at java.lang.Thread.run(Unknown Source)


这似乎是要把这个设备重定向到网络上?我不太清楚,希望有朋友帮忙解惑~~谢谢。


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


可能上面的描述有点不清晰,补充一下,这个工具是一个服务端程序,相应地我写了个客户端程序,它们的工作方式是服务端程序在上网本上获取音频并监听端口,在另外的计算机上用客户端程序连接上该端口,然后开始传输音频流。


用客户端程序连接服务端 与 用远程桌面连接到上网本上是两件事,用远程桌面连接上去做的只是调试服务端程序。

举报
scheung
发帖于4年前 1回/1K+阅
顶部