VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 858|回复: 3

JMF如何同时采集音频和视频进行RTP传输啊?急!

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-3-19 21:30:02 | 显示全部楼层 |阅读模式
本人刚开始研究jMF,需要同步传送语音与摄像头视频,找好些资料没有同时采集声音和视频进行RTP传输的。我知道在RTPManager里可以进行多轨传输,可是不知道怎么能够得到一个具备声音和图象的DataSource,难道需要分两部分做吗?一个程序负责采集语音然后建立RTP传输,另一个程序负责采集视频然后传输那样也就失去了RTPManager的价值了,不过本人程序代码里,是使用RTPManager建立多轨了,可是不知道如何得到音视频?
请高手给予指点?


this.locator = new javax.media.CaptureDeviceManager().getDevice("vfw:Microsoft WDM Image Capture (Win32):0").getLocator();
        this.ipAddress = ipAddress;
        Integer integer = Integer.valueOf(pb);
        if (integer != null)
            this.portBase = integer.intValue();
    }

           DataSource ds;
        DataSource clone;

            ds = javax.media.Manager.createDataSource(locator);
            processor = javax.media.Manager.createProcessor(ds);
        ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
        processor.setContentDescriptor(cd);
        Format supported[];
        Format chosen;
        boolean atLeastOneTrack = false;
        for (int i = 0; i < tracks.length; i++) {
            Format format = tracks[i].getFormat();
            if (tracks[i].isEnabled()) {

                supported = tracks[i].getSupportedFormats();
                if (supported.length > 0) {
                    if (supported[0] instanceof VideoFormat) {
                   chosen = checkForVideoSizes(tracks[i].getFormat(),supported[0]);
                    } else
                        chosen = supported[0];
                    tracks[i].setFormat(chosen);
                    System.err.println("Track " + i + " is set to transmit as:");
                    System.err.println("  " + chosen);
                    atLeastOneTrack = true;
                } else
                    tracks[i].setEnabled(false);
            } else
                tracks[i].setEnabled(false);
        }

        setJPEGQuality(processor, 0.5f);
        dataOutput = processor.getDataOutput();
        return null;
    }

    private String createTransmitter() {
        PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;
        PushBufferStream pbss[] = pbds.getStreams();
        rtpMgrs = new RTPManager[pbss.length];
        SessionAddress localAddr, destAddr;
        InetAddress ipAddr;
        SendStream sendStream;
        int port;
        SourceDescription srcDesList[];
        for (int i = 0; i < pbss.length; i++) {
            try {
                rtpMgrs[i] = RTPManager.newInstance();            
                port = portBase + 2*i;
                ipAddr = InetAddress.getByName(ipAddress);
                localAddr = new SessionAddress( InetAddress.getLocalHost(),
                                                port);
                destAddr = new SessionAddress( ipAddr, port);
                rtpMgrs[i].initialize( localAddr);
                rtpMgrs[i].addTarget( destAddr);
                System.err.println( "Created RTP session: " + ipAddress + " " + port);
                sendStream = rtpMgrs[i].createSendStream(dataOutput, i);               
                sendStream.start();
            } catch (Exception  e) {
                return e.getMessage();
            }
        }

        return null;
    }


    /****************************************************************
     * Inner Classes
     ****************************************************************/
    public static void main(String [] args) {


        Format fmt = null;
        int i = 0;

        AVTransmit2 at = new AVTransmit2("192.168.0.63", "42020", fmt);

        String result = at.start();
    }


回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-23 08:45:01 | 显示全部楼层
你这仅是视频数据传输?
采集的时候就没有对音频数据进行采集
JAVA中有很好的数据采集例子 很不错的
你到java.sun.com上搜索一下
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-26 09:45:01 | 显示全部楼层
分别获得音频和视频的DataSource,然后用它们俩生成一个MergingDataSource。
DataSource ds = Manager.createMergingDataSource(new DataSource[] { dsAudio, dsVideo });
然后用这个DataSource一起传就可以了,这个我写过,没有问题。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-28 00:30:01 | 显示全部楼层
我做到摄像头视频传输这块出错了,传输声音,音视频文件都可以
我看过        ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
        p.setContentDescriptor(cd);
这块有问题,加上这两句的话运行到processor.realize 会报错,但是不加这两句,
运行到transmit 函数又会出现 异常,说是格式不对Couldn't create RTP data sink

哪位高手帮帮忙吧,我已经被折磨好几天了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表