我正在尝试在 Android 上构建一个应用程序,将视频从设备摄像头流式传输到流式服务器。
我看过不同的帖子和解决方案,这是我目前的状态,借助于(我使用 Sipdroid、jboss-netty 和分析 wireshark 上的数据包)
- 我构建了 RTSP 堆栈并成功连接到服务器
2.理论上我能够创建一个rtp数据包并将其发送到 服务器
我的问题是捕获帧并在 RTP 数据包中发送数据。 我有两个方向:
1- 使用相机和 AuidoRecorder 捕获原始媒体数据并使用 rtp 发送,问题是这些数据是否应该根据 RTSP 的 ANNOUNCE 中的 .sdp 文件描述进行编码???据我了解,来自相机和麦克风的数据将是未编码的原始数据 另一件事是我如何正确地在 RTP 数据包中制定这个原始数据。
2- 媒体记录器已经对数据进行了编码,我能够按照 .sdp 文件中的定义设置编码。我试图找到一种从输出文件中读取的方法,但这需要我将 . mp4 文件数据到流数据,这似乎是一项复杂的任务。
我的问题是我是不是把事情复杂化了,以 RTP 数据包发送视频和音频的原始数据就足够了,流媒体服务器会处理剩下的吗???? 请在这件事上提供任何帮助和指导,我将不胜感激。
谢谢
最佳答案
首先,您必须按照 .sdp 文件中的描述对您的数据进行编码。您想尝试 MediaRecorder 而不是 AuidoRecord 吗? MediaRecorder 允许您设置您将获得的数据的编码。
此外,我建议您通过套接字创建一个 FileDescriptor,以便可以通过套接字流而不是静态文件来传输数据。 代码可能是这样的:
Socket socket = new Socket(serverAddr, serverPort);
socket.setTcpNoDelay(true);
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
Camera camera = Camera.open();
camera.unlock();
MediaRecorder recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
recorder.setVideoFrameRate(15);
recorder.setVideoSize(480, 320);
recorder.prepare();
recorder.start();
RTP传输的方式正是我现在的困扰。
关于android - 来自 Android 设备相机的视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6725483/