草庐IT

Android:同时录制和流式传输

coder 2023-11-23 原文

这并不是一个真正的问题,而是我为解决我面临的最具挑战性的功能之一所做的所有尝试的介绍。

我用 libstreaming库将实时视频流式传输到 Wowza Server我需要同时将它记录在 SD 卡中。我在下面展示了我的所有尝试,以便从社区收集新的想法。

将字节从 libstreaming 流复制到 mp4 文件

发展

我们在 libstreaming 库中创建了一个拦截器,将所有发送的字节复制到一个 mp4 文件中。 Libstreaming 通过 LocalSocket 将字节发送到 Wowza 服务器。它使用 MediaRecorder 访问设备的摄像头和麦克风,并将输出文件设置为 LocalSocket 的输入流。我们所做的是围绕这个从 InputStream 扩展的输入流创建一个包装器,并在其中创建一个 File 输出流。因此,每次 libstreaming 对 LocaSocket 的输入流执行读取时,我们都会将所有数据复制到输出流,尝试创建一个有效的 MP4 文件。

障碍

当我们尝试读取该文件时,它已损坏。我们意识到 MP4 文件中缺少元信息。特别是 moov 原子。我们试图延迟流媒体的关闭,以便有时间发送这个 header (这仍然是一个猜测),但它没有奏效。为了测试这些数据的一致性,我们使用付费软件来尝试恢复视频,包括标题。它变得可玩,但主要是绿屏。所以这变成了一个不可信的解决方案。我们还尝试使用“untrunc”,一个免费的开源命令行程序,它甚至无法启动恢复,因为没有 moov atom。

使用编译成android的ffmpeg访问摄像头

发展

FFMPEG 有一个带有 Java 接口(interface)的 gradle 插件,可以在 Android 应用程序中使用它。我们认为我们可以通过命令行访问摄像机(它可能在“/dev/video0”中)并将其发送到媒体服务器。

障碍

我们在尝试访问相机时收到错误“权限被拒绝”。解决方法是将设备 root 以访问它,但这会使手机失去保修并可能使它们变砖。

使用 ffmpeg 编译成 android 结合 MediaRecorder

发展

我们尝试通过 MediaRecorder 将 FFMPEG 流制作为在手机内录制的 mp4 文件

障碍

FFMPEG 无法流式传输尚未完成录制的 MP4 文件。

使用 ffmpeg 用 libstreaming 编译成 android

发展

Libstreaming 使用LocalServerSocket 作为app 和服务器的连接,所以我们认为我们可以使用连接LocalServerSocket 本地地址的ffmpeg 将流直接复制到SD 卡内的本地文件中。流开始后,我们还运行了 ffmpeg 命令开始将数据记录到文件中。使用 ffmpeg,我们相信它会以正确的方式创建 MP4 文件,这意味着包含 moov atom 头文件。

障碍

创建的“地址”不能通过命令行读取,作为手机内部的本地地址。所以复制是不可能的。

使用 OpenCV

发展

OpenCV 是一个开源的跨平台库,为计算机视觉实验和应用程序提供构建块。它提供了用于捕获、处理和呈现图像数据的高级接口(interface)。它有自己的 API 来连接设备摄像头,所以我们开始研究它是否有必要的功能来同时传输和记录。

障碍

我们发现该库并没有真正定义为执行此操作,而是更多地定义为图像数学处理。我们甚至得到了使用 libstreaming 的建议(我们已经这样做了)。

使用 Kickflip SDK

发展

Kickflip 是一种媒体流服务,提供自己的 SDK 用于在 android 和 IOS 中进行开发。它还使用 HLS 而不是 RTMP,后者是一种较新的协议(protocol)。

障碍

他们的 SDK 要求我们创建一个带有摄像头 View 的 Activity,该 View 占据设备的整个屏幕,破坏了我们应用程序的可用性。

使用 Adob​​e Air

发展

我们开始咨询 Play 商店中已有应用程序的其他开发人员,这些应用程序已经传输到服务器。

障碍

与这些开发人员取得联系后,他们保证无法使用该技术同时进行录制和流式传输。更重要的是,我们必须使用 Adob​​e Air 从头开始​​重做整个应用程序。

更新

网页版

发展

我们在 this great project 之后开始使用 WebRTC .我们在 NODEJS 服务器中包含了信令服务器,并开始通过套接字进行标准握手。我们仍在通过 webrtc 在本地录制和流媒体之间切换。

障碍

Webrtc 不适用于所有网络配置。除此之外,相机获取都是 native 代码,这使得尝试复制字节或拦截它变得更加困难。

最佳答案

如果您愿意放弃 libstreaming,有一个库可以轻松地同时流式传输和录制到本地文件。

https://github.com/pedroSG94/rtmp-rtsp-stream-client-java

克隆项目并运行示例应用程序。例如,点击“默认 RTSP”。输入您的端点。点击“开始流”,然后点击“开始录制”。然后点击“停止流”和“停止记录”。我已经用 Wowza Server 对此进行了测试,效果很好。该项目还可以用作库而不是独立的应用程序。

关于Android:同时录制和流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29012335/

有关Android:同时录制和流式传输的更多相关文章

  1. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

    在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

  4. ruby - 带有 header 的 Sinatra 流式响应 - 2

    我想通过Sinatra应用程序代理远程文件。这需要将带有header的HTTP响应从远程源流式传输回客户端,但我不知道如何在Net::HTTP#提供的block内使用流式API时设置响应header获取响应。例如,这不会设置响应头:get'/file'dostreamdo|out|uri=URI("http://manuals.info.apple.com/en/ipad_user_guide.pdf")Net::HTTP.get_response(uri)do|file|headers'Content-Type'=>file.header['Content-Type']file.re

  5. ruby - 使用 Ruby 将 HTTP GET 的响应主体流式传输到 HTTP POST - 2

    我正在尝试下载一个大文件,然后使用Ruby将该文件发布到REST端点。该文件可能非常大,即超过可以存储在内存中甚至磁盘上的临时文件中的容量。我一直在用Net::HTTP尝试这个,但我愿意接受任何其他库(rest-client等)的解决方案,只要他们做我想做的事情。这是我尝试过的:require'net/http'source_uri=URI("https://example.org/very_large_file")source_request=Net::HTTP::Get.new(source_uri)source_http=Net::HTTP.start(source_uri.ho

  6. Ruby:net/http 可以同时发起 GET 和 POST 请求吗? - 2

    是否可以同时传递GET和POST参数?uri=URI.parse("http://www.example.com/post.php?a=1&b=2")req=Net::HTTP::Post.new(uri.path,{'Referer'=>"http://www.example.com/referer",'User-Agent'=>"Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)",'Cookie'=>$cookie})req.set_form_data({'foo'=>'bar','bar'=>'foo'})http=Net::HTTP.ne

  7. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  8. ruby - 如何制作同时针对 MRI 和 JRuby 的 gem? - 2

    我想制作一个gem,当其他人尝试将它与MRI一起使用时,它将使用C代码,而当他们从JRuby中使用它时,它将使用Java代码。nokogiri和pumagems就是这样做的,我看过他们的代码,但没有看到他们是如何实现的。 最佳答案 这是通过使用rvm(或其他类似工具在rubies之间切换)和rake-compiler为您针对的不同平台交叉编译gem来完成的。.gemspec文件必须指定每个平台所需的文件;这是通过检查gem正在编译的平台来完成的:Gem::Specification.newdo|gem|#...ifRUBY_PLAT

  9. Ruby AWS::S3::S3Object (aws-sdk):是否有与 aws-s3 一样的流式数据方法? - 2

    在aws-s3中,有一种方法(AWS::S3::S3Object.stream)可让您将S3上的文件流式传输到本地文件。我无法在aws-sdk中找到类似的方法。即在aws-s3中,我这样做:File.open(to_file,"wb")do|file|AWS::S3::S3Object.stream(key,region)do|chunk|file.writechunkendendAWS::S3:S3Object.read方法确实将block作为参数,但似乎没有对其执行任何操作。 最佳答案 aws-sdkgem现在支持S3中对象的分

  10. ruby-on-rails - 如何从服务器目录制作 Paperclip 进程文件? - 2

    我想对服务器目录中的所有文件运行Paperclip。基本上,我想允许用户将一些文件通过FTP传输到我的网络服务器,然后我可以手动运行rake任务让Paperclip处理所有文件(调整图像大小、更新数据库等)。我该怎么做? 最佳答案 我不确定我是否理解您的问题-您是在询问远程运行rake任务还是如何导入图像?在后一种情况下有一个答案。首先你需要一些模型来保存图像和一些其他数据,像这样:classPicture{:thumb=>"100x100>",:big=>"500x500>"}end您可以在lib/tasks文件夹中创建简单的ra

随机推荐