如何解码从parcelfiledescriptor收到的H.264视频流

时间:2013-09-19 05:45:24

标签: android sockets video-streaming decode video-capture

我正在两个Android手机之间创建一个直播视频流的Android应用程序。我已经在这些设备之间建立了套接字连接。我在一台设备上捕获视频并将流发送到其他设备,但目前我只想保存在接收方移动设备中并保存。我在一台设备上使用MediaRecorder进行录制,因此通过设置数据使用parcelfiledescriptor对象流式传输到接收器I,m

客户端代码

    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
    mediaRecorder.setOutputFile(pfd.getFileDescriptor());

接收方代码

  pfd= ParcelFileDescriptor.fromSocket(s);
  InputStream in = new FileInputStream(pfd.getFileDescriptor()); 
  DataInputStream clientData = new DataInputStream(in);  
  OutputStream newDatabase = new FileOutputStream(file);
  int available=in.available();
  byte[] buffer = new byte[available];
  int length;


                while((length = in.read(buffer)) > 0)
                {
                    newDatabase.write(buffer, 0, length);

                }
                newDatabase.close();

正在接收方移动设备上创建视频文件,但它无法接收任何字节。因此,我会在接收器端解码即将到来的流,因为发送的视频流是在录制时编码的。那么如何解码收到的流?我找到了一些像MediaExtractor和MediaCodec这样的解决方案......但是这会使用实时视频捕获,而且我会在android version 2.3.6 GingerBread上进行测试 是否可以从版本2.3.6的MediaCodec解码视频流或其他方法可用?

1 个答案:

答案 0 :(得分:2)

  

正在接收方手机上创建视频文件,但它无法接收任何字节。

如果我理解你的话,你就没有从套接字中获取数据。这是一个单独的问题,与视频格式,解码或编码无关。

要调试套接字,使用仅转储收到的数据的单独应用程序可能会有所帮助。一旦数据看起来很好,您就可以进入下一步 - 解码视频。


问题的第二部分是视频格式。您正在使用mp4,它不能用于流式传输。 Here is more info about the format structure.您可以使用mp4将视频录制到本地文件中,然后将整个文件传输到某个地方的套接字,但由于套接字的不可搜索性质,无法进行真正的实时流式传输(如链接中所述)文章)。在文件的开头有一个元数据块,它充当“目录”,没有它,以前的数据只是垃圾。问题是,只有在获得所有内容后才能组装“目录”。但在那一刻,数据已经通过套接字发送,你不能在其开头插入任何内容。

几乎没有走路,但这只是为了您未来的研究,我还没有使用它们。

最直观的方法是从mp4切换到mpeg-ts,这是一个专为流媒体设计的容器。查看MediaRecorder.OutputFormat中隐藏常量,值为8。

另一个选择是将原始H.264数据打包成RTP / RTCP数据包,这也是为流设计的协议。您的应用程序也可以流式传输到支持该协议的任何设备(例如运行VLC的PC)。要进一步研究,请查看Spydroid IP camera,它完全符合要求。