Android中的视频流传输通过parcelFileDescriptor

5

我成功地通过Mediarecorder将视频录制在SD卡上,但我想在不写入SD卡的情况下将这个视频发送到服务器。我搜索了相关信息,发现parcelFileDescriptor是将视频发送到TCP套接字的方法,但我不知道如何在服务器端接收它,请解释一下。这是我的客户端代码:

socket = new Socket("hostname", portnumber);
ParcelFileDescriptor  pfd =ParcelFileDescriptor.fromSocket(socket);
            recorder = new MediaRecorder();
            recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            recorder.setOutputFile(pfd.getFileDescriptor());
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            mPreview = new Preview(VideoRecorder.this,recorder);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setContentView(mPreview);

我希望在服务器端接收并播放它,以创建实时视频传输。需要知道的是,“MediaRecorder”可以记录3GPP或MP4格式。该文件格式由原子组成,其中每个原子都以其大小开头。文件中有不同类型的原子,mdat原子存储编码视频和音频的实际原始帧。在Cupcake版本中,Android开始写入具有编码帧的mdat原子,但由于明显的原因,必须将原子的大小留空。当写入可寻址文件描述符时,可以在录制后简单地填补空白,但是套接字文件描述符当然是不可寻址的。因此,在录制完成后,必须修复接收到的流,或者服务器必须处理原始视频/音频帧。我想要一个服务器端代码(可能是Android手机或PC)。如果有其他方法,请帮忙提供......谢谢。
1个回答

2
为了从Android或PC流媒体,您需要实现承载流媒体的协议和服务器。有几种协议可供选择,例如HSL、RTPS等(更多信息请参见http://en.wikipedia.org/wiki/Streaming_media)。这不是一个简单的问题,只有极少数成功的Android流媒体服务。
您可以在此处查看如何在Android上实现流媒体服务:https://github.com/fyhertz/libstreaming 该库在Android 5上无法使用,但在4.4.x上可以使用。

1
这个库的作者写道,他发现了一个诀窍使它能在Android 5中运行。 - CoolMind
你能否给一个链接吗?我在 GitHub 上看到只有一条有关支持 Lolipop 的尝试的评论。不清楚它是否正常工作。 - Califlower
这是一个来自GitHub的链接(https://dev59.com/418d5IYBdhLWcg3wTAl-)。它说:"由于安全原因,从Android Lollipop开始,不再支持使用LocalSocket。但是使用ParcelFileDescriptor可以解决问题。有关更多详细信息,请参见MediaStream.java文件。" - CoolMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接