Android 如何解码从parcelfiledescriptor接收的H.264视频流
我正在创建一个Android应用程序,在两部Android手机之间进行实时视频流传输。我已经在这些设备之间建立了套接字连接。我正在一个设备中捕获视频并将流发送到另一个设备,但目前我只想将其保存在接收方移动设备中并保存。我正在一台设备中使用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.
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对象发送的流。。。因为它会有标题和一些与视频丢失相关的信息…所以如何解决这个问题意味着我需要获取该流并播放视频