直播主题

2022-09-04 02:42:38

对于那些有兴趣您的设备Web服务器的直播的人来说,这可能是一个非常有趣的话题。(主要安卓/Java)我终于找到了一种方法,如何将视频从设备的摄像头直播到我的网络服务器(网站)。在wifi网络上,在wifi网络上显示大约需要1帧/秒,它也可以在EDGE / 3G网络上工作。在这个主题/问题中,我想讨论有关直播的新技术,改进,想法,因为我将与您的人分享我的(代码也值得赞赏)。

我的代码反复使用 setOneShotPreviewCallback() 调用 PreviewFrame() 从相机预览中拍摄快照。帧以 YUV 格式提供,因此 raw2jpg() 将其转换为 jpeg 编码器的 32 位 ARGB。NV21 是 YUV 平面格式。

getPicture() 由应用程序调用,并为私有字节数组 mCurrentFrame 中的图像生成 jpeg 数据并返回该数组。

在此之后,byteArray mCurrentFrame获得Base64编码,并以HTTP POST方法与Base64的字符串值和自己的ID代码一起发送到我的Web服务器,因此人们将无法向其发送另一个图像。在Web服务器上,它再次被解码并放入文件测试中.jpg。PHP和Javascript正在Web服务器上运行。PHP 获取 POST 方法,JavaScript 每 750 秒重新加载一次图像。这基本上就是它的工作原理。

现在,我对您的想法,改进以及您想添加/询问的其他事情非常感兴趣。以下是我的一些问题:

1)使用音频进行实时流式传输的最佳方法是什么?视频录制还是我的方法+录音?

2)您将如何处理视频录制流?

3)如何将音频流式传输到Web服务器?(主要目标)(使用 Java、PHP 和 JavaScript)

4)我还计划在i中添加典型的直播功能,例如,当一个名人出现时,您可以在直播时显示他的名字,或者只是将图像从sd目录添加到直播中。您是否还会对其进行解码并叠加图像,或者以某种方式将图像放入直播中?

这个主题主要是针对问题的,所以请这对这里的一些人来说可能是一个很大的帮助。因此,我添加了50(呜呜!)代表的赏金。

诚挚的, XverhelstX


答案 1

令我印象深刻的是,http发布可能不是将视频实时流式传输到服务器的好方法。其他人一直在玩实时流,他们使用套接字将实时视频流和音频流广播到他们的服务器。

我觉得这很吸引人 -- 这里有一个链接。

http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

但是这个家伙还发布了一个部分代码示例 -

String hostname = "your.host.name";
int port = 1234;

Socket socket = new Socket(InetAddress.getByName(hostname), port);

ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);

MediaRecorder recorder = new MediaRecorder();

// Additional MediaRecorder setup (output format ... etc.) omitted

recorder.setOutputFile(pfd.getFileDescriptor());

recorder.prepare();

recorder.start();

我不知道的很酷的部分是ParcelFileDescriptor - 它在Android文件系统上创建一个文件,实际上是一个通往套接字的管道 - 所以任何写入文件的东西都会通过网络广播到远程服务器。套接字也是做这种事情的正确方法,因为它们允许您连续发送数据,直到记录完成,而不必一遍又一遍地重新发送标头。

我认为这种技术很酷的是,他从字面上获取MediaRecorder的输出(这将是一个编码的视频流),并将其通过套接字泵送到他的服务器。然后,他可以简单地保存通过套接字进入的数据。没有逐帧,没有处理(Android SDK没有很好地公开SDK中的编码器,并且它们非常耗费性能)。

人们报告说它有效,但我还没有测试过。无论如何,希望这是有帮助的。


答案 2

您每次都发送整个快照吗?为什么不尝试使用一些视频压缩技术,例如,每次发送压缩版本(可能是差异或类似内容)时,不要发送完整图像,而是在服务器上根据上次图像和刚刚接收的数据创建图像。我认为所有视频编解码器都这样做,您可以尝试查看一些开放式编解码器规范以获得一些想法。

关于音频。我会分开发送音频流,然后他们根据我们现在显示的视频帧将其与视频流同步。

基本上,我会尝试让我的流媒体尽可能接近真正的视频流的工作原理。也许你可以研究ffmpeg,ffmpeg有一个rtsp服务器,如果你能为Android构建它,你会大大简化你的工作。