关于Java的一个数据类型转换问题

时间:2021-04-21 17:01:06
从网络上接收到Packet包,里面是转换成byte[]类型的视频(程序需要,只能是byte[])我需要接收后用Player播放,请问如何转换成相应的DataSource,或是其它类型?谢谢!

9 个解决方案

#1


你用的JMF?若用的JMF为什么不用JMF的接收和解包
你直接接回来的byte[]又不知道编码格式,又不知道你的传输协议要转成其他对象,应该没人能在这种条件下做出来的吧

#2


to:windstear1(枯枝烂叶也是宝) 
先谢谢你了,我以为这不重要就没写上去,原视频是RGB_RTP编码,用udp协议。我想做个视频采集加密后再传输到其他用户播放的程序,现在采集和直接传输没有问题,只是在接收加密并传送过来的packet后不知如何还原成player可以播放的格式?我找了许多函数比如PushBufferStream、ByteArrayInputStream等等都不能直接达到要求,到这里就进行不下去了,问题究竟出在哪里?恳请指教,谢谢!

#3


再换句话说:我试着在接收端读出传送过来的packet,读到PushBufferStream中,下一步怎么转换成player可播放的形式?
  try{
      mgrs = new RTPManager[sessions.length];
      RTPSocketAdapter rtpsocketAdapter = new RTPSocketAdapter(
          InetAddress.getLocalHost(), 6000);
      mgrs[0].initialize(rtpsocketAdapter);
      byte[] buffer = new byte[64];
      while(true){
        DatagramPacket dp = new DatagramPacket(buffer, 0,
                                               InetAddress.getByName(
            "192.168.0.3"), 6000);
        rtpsocketAdapter.dataSock.receive(dp);
        System.err.println("Deciphering code. ");//解密部分,代码略
        PushSourceStream pss = rtpsocketAdapter.getDataInputStream();
        pss.read(buffer, 0, 64);
    
    //到这里停步了。。。how???

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

#4


急盼回复。。。

#5


看你的代码我还有几处不太明白哦
先是 rtpsocketAdapter.dataSock.receive(dp); 因为RTPSocketAdapter 实际上是封装了DatagramSocket ,干嘛要直接用dataSock去接收DatagramPacket,

再就是
rtpsocketAdapter.getDataInputStream();
得到的 PushSourceStream 应该是已经经过SourceTransferHandler处理的Stream了,你读出来的buffer就应该为转换过格式的byte[],在SourceTransferHandler中去做解密什么的

你是说担心的是怎么把byte[]转换成DataSource,有个叫RTPPushDataSource得东东,你不要直接读byte[]出来,把rtpsocketAdapter.getDataInputStream();取得的PushSourceStream用它来做中转,然后通过RTPPushDataSource得到MediaLocator,接下来的事就播放了呢

#6


很有启发,感谢windstear1!
我会按照你的提示改动,请继续关注,再次感谢!!

#7


To: windstear1
对"取得的PushSourceStream用它来做中转"我的理解是不是把取得的PushSourceStream用RTPPushDataSource.setInputStream()作为输入流,再从客户端使用RTPPushDataSource.getOutputStream() 方法得到输出流?
能具体解释一下吗?谢谢!

#8


$ zz╭ ╮╭ ﹌╮.       $
$   z(o-.-o)(o-.-o) .      $
$ ┏~﹊︸ ̄~﹊︸ ̄~┓      $
$ IT者-IT开发者的网站--    $
$ 10万篇技术资料--天天更新 $
$ -----www.itzhe.cn-----   $

#9


还得麻烦问一句,你说“在SourceTransferHandler中去做解密”,interface SourceTransferHandler中的transferData()是个空方法,你的意思是要重写transferData()加入解密部分?如果是怎样重写?再就是下面的流程,到图中最后一步之前和你的思路一样吗?
现在没有头绪,还望指点迷津,谢谢!

PushBufferStream----->byte[] buffer1----->buffer2----->OutputDataStream
                read                cipher       write        | setInputStream
                                                              |
                                                       RTPPushDataSource
                                                              |
                                                            |NET|
                                                              |
                                                       RTPPushDataSource
                                                              |getOutputStream
                                               ???            |
                              MediaLocator<--------------PushSourceStream

#1


你用的JMF?若用的JMF为什么不用JMF的接收和解包
你直接接回来的byte[]又不知道编码格式,又不知道你的传输协议要转成其他对象,应该没人能在这种条件下做出来的吧

#2


to:windstear1(枯枝烂叶也是宝) 
先谢谢你了,我以为这不重要就没写上去,原视频是RGB_RTP编码,用udp协议。我想做个视频采集加密后再传输到其他用户播放的程序,现在采集和直接传输没有问题,只是在接收加密并传送过来的packet后不知如何还原成player可以播放的格式?我找了许多函数比如PushBufferStream、ByteArrayInputStream等等都不能直接达到要求,到这里就进行不下去了,问题究竟出在哪里?恳请指教,谢谢!

#3


再换句话说:我试着在接收端读出传送过来的packet,读到PushBufferStream中,下一步怎么转换成player可播放的形式?
  try{
      mgrs = new RTPManager[sessions.length];
      RTPSocketAdapter rtpsocketAdapter = new RTPSocketAdapter(
          InetAddress.getLocalHost(), 6000);
      mgrs[0].initialize(rtpsocketAdapter);
      byte[] buffer = new byte[64];
      while(true){
        DatagramPacket dp = new DatagramPacket(buffer, 0,
                                               InetAddress.getByName(
            "192.168.0.3"), 6000);
        rtpsocketAdapter.dataSock.receive(dp);
        System.err.println("Deciphering code. ");//解密部分,代码略
        PushSourceStream pss = rtpsocketAdapter.getDataInputStream();
        pss.read(buffer, 0, 64);
    
    //到这里停步了。。。how???

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

#4


急盼回复。。。

#5


看你的代码我还有几处不太明白哦
先是 rtpsocketAdapter.dataSock.receive(dp); 因为RTPSocketAdapter 实际上是封装了DatagramSocket ,干嘛要直接用dataSock去接收DatagramPacket,

再就是
rtpsocketAdapter.getDataInputStream();
得到的 PushSourceStream 应该是已经经过SourceTransferHandler处理的Stream了,你读出来的buffer就应该为转换过格式的byte[],在SourceTransferHandler中去做解密什么的

你是说担心的是怎么把byte[]转换成DataSource,有个叫RTPPushDataSource得东东,你不要直接读byte[]出来,把rtpsocketAdapter.getDataInputStream();取得的PushSourceStream用它来做中转,然后通过RTPPushDataSource得到MediaLocator,接下来的事就播放了呢

#6


很有启发,感谢windstear1!
我会按照你的提示改动,请继续关注,再次感谢!!

#7


To: windstear1
对"取得的PushSourceStream用它来做中转"我的理解是不是把取得的PushSourceStream用RTPPushDataSource.setInputStream()作为输入流,再从客户端使用RTPPushDataSource.getOutputStream() 方法得到输出流?
能具体解释一下吗?谢谢!

#8


$ zz╭ ╮╭ ﹌╮.       $
$   z(o-.-o)(o-.-o) .      $
$ ┏~﹊︸ ̄~﹊︸ ̄~┓      $
$ IT者-IT开发者的网站--    $
$ 10万篇技术资料--天天更新 $
$ -----www.itzhe.cn-----   $

#9


还得麻烦问一句,你说“在SourceTransferHandler中去做解密”,interface SourceTransferHandler中的transferData()是个空方法,你的意思是要重写transferData()加入解密部分?如果是怎样重写?再就是下面的流程,到图中最后一步之前和你的思路一样吗?
现在没有头绪,还望指点迷津,谢谢!

PushBufferStream----->byte[] buffer1----->buffer2----->OutputDataStream
                read                cipher       write        | setInputStream
                                                              |
                                                       RTPPushDataSource
                                                              |
                                                            |NET|
                                                              |
                                                       RTPPushDataSource
                                                              |getOutputStream
                                               ???            |
                              MediaLocator<--------------PushSourceStream