Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何解码从parcelfiledescriptor接收的H.264视频流_Android_Sockets_Video Streaming_Decode_Video Capture - Fatal编程技术网

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

Android 如何解码从parcelfiledescriptor接收的H.264视频流,android,sockets,video-streaming,decode,video-capture,Android,Sockets,Video Streaming,Decode,Video Capture,我正在创建一个Android应用程序,在两部Android手机之间进行实时视频流传输。我已经在这些设备之间建立了套接字连接。我正在一个设备中捕获视频并将流发送到另一个设备,但目前我只想将其保存在接收方移动设备中并保存。我正在一台设备中使用MediaRecorder进行录制,因此要将数据流传输到接收器,我正在通过设置数据使用parcelfiledescriptor对象 客户端代码 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.

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

客户端代码

    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();
接收器端代码

    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 2.3.6版姜饼进行测试 是否可以从2.3.6版的
MediaCodec
解码视频流,或者使用其他方法

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

如果我没弄错的话,你没有从套接字中得到任何数据。这是一个单独的问题,与视频格式、解码或编码无关

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


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

很少有漫游工具,但这只是为了你将来的研究,我还没有使用它们

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


另一种选择是将原始H.264数据打包到RTP/RTCP数据包中,RTP/RTCP数据包也是为流媒体设计的协议。此外,您的应用程序将能够流式传输到支持此协议的任何设备(例如运行VLC的PC)。要进一步研究,请看一看,这正是问题所在。

嗨,Divya,你找到解决方案了吗,我也面临同样的问题请告诉我你是否找到了解决方案HIIII Dipu作为回复David我能够保存,但仍然有很多问题…请检查我的评论大卫的回复HIII David…我能够通过parcelfiledescriptor对象将文件保存在另一台设备上…意味着我更改了接收端的代码..意味着我设置了条件写入文件,直到它连接到套接字,才能在服务器端移动设备上写入。但另一个问题是服务器端保存的视频我无法在默认的android媒体播放器中播放该文件…但它可以由其他媒体播放器播放,如安装在移动设备上的MXPlayer和通过vlc播放器在pc上的MXPlayer…也可以u建议我如何解码视频并播放..方法是什么?现在我需要它作为实时视频流,当我从一台设备录制时,我需要在另一台设备上播放..我在服务器端创建了一个MediaPlayer对象,并将其发送到MediaPlayer.setDataSource(pfd.getFileDescriptor());无法播放视频…出现异常“无法创建mediaPlayer”。。。因此,请您提供一些ideo如何解决这个问题并播放,因为在我的android应用程序中,我只能创建默认的mediaplayer对象,不支持播放…如何继续…并且您还提到,一旦数据看起来很好,你可以进入下一步-解码视频…如何做我建议你先尝试发送一个常规文件,看看结果是否正常。然后转到视频内容。但同样,你不能简单地通过写入文件/套接字并从另一端拉回数据来流。Hiii我可以发送一个常规文件…这是以前已经做过的…这个问题只是我面临的…这意味着我也知道我不能直接播放将要流的parcelfiledescriptor对象发送的流。。。因为它会有标题和一些与视频丢失相关的信息…所以如何解决这个问题意味着我需要获取该流并播放视频