Firebase存储视频流

Firebase存储视频流,firebase,video-streaming,google-cloud-platform,firebase-storage,Firebase,Video Streaming,Google Cloud Platform,Firebase Storage,我正在开发一款具有视频流功能的应用程序。我正在使用firebase数据库和firebase存储。我试图找到一些关于firebase存储如何处理视频文件的文档,但实际上找不到太多 文件中提到firebase storage与其他谷歌应用程序服务合作,支持CDN和视频流,但所有搜索似乎都走向了死胡同。有什么建议吗 我认为有几种类型的视频流可能会改变我们的答案: 直播(订阅者正在观看事件发生) Youtube风格(发布视频,最终用户在方便的时候观看) 在使用Firebase存储和Firebase实

我正在开发一款具有视频流功能的应用程序。我正在使用firebase数据库和firebase存储。我试图找到一些关于firebase存储如何处理视频文件的文档,但实际上找不到太多


文件中提到firebase storage与其他谷歌应用程序服务合作,支持CDN和视频流,但所有搜索似乎都走向了死胡同。有什么建议吗

我认为有几种类型的视频流可能会改变我们的答案:

  • 直播(订阅者正在观看事件发生)
  • Youtube风格(发布视频,最终用户在方便的时候观看)
在使用Firebase存储和Firebase实时数据库构建了一个实时流式潜望镜风格的应用程序之后,我强烈建议不要这样做——我们上传了三秒钟的数据块,并通过实时数据库将它们同步。虽然它工作正常(令人惊讶地好),但在非常好的互联网上有大约5秒的延迟,而且它也不是最有效的解决方案(毕竟,你正在上传和存储视频,而且没有任何转码)。我建议使用一些WebRTC风格,为视频传输而构建,并使用实时数据库沿流发送信号


另一方面,在Firebase功能上构建mobile YT绝对是可能的。这里的诀窍是对视频进行转码(使用Zencoder或Bitmovin之类的工具,更多信息请参见:)将上传的视频分割成不同分辨率的小块(例如,不同格式的iOS需要HLS进行流媒体处理)。您的客户端可以将区块信息存储在实时数据库中(区块名称、可用分辨率、区块数量),并可以在视频播放过程中从存储器中下载所述区块。

如果您想从Firebase存储器中播放视频,这是我找到的最佳方法。这取决于视频文件的大小。我只需要10-30mb的文件,所以这个解决方案对我来说很好。只需将Firebase Url视为常规Url:

String str = "fire_base_video_URL";
Uri uri = Uri.parse(str);

videoViewLandscape.setVideoURI(uri);
progressBarLandScape.setVisibility(View.VISIBLE);
videoViewLandscape.requestFocus();
videoViewLandscape.start();
如果要循环播放视频:

videoViewLandscape.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
如果要在视频开始前显示进度条,请执行以下操作:

videoViewLandscape.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
            progressBarLandScape.setVisibility(View.GONE);
            return true;
        }
        else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START){
            progressBarLandScape.setVisibility(View.VISIBLE);
            return true;
        }
        return false;
    }
});

这并不是最好的做法,但在我找到一个好的视频流服务之前,它目前对我有效。

您可以在Firebase云存储上托管HLS视频。这对我来说很有效。 诀窍是修改播放列表
.m3u8
文件以包含存储文件夹前缀,以及播放列表中每个文件项的
?alt=media
后缀:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:2.760000,
<folder_name>%2F1_fileSequence_0.ts?alt=media
#EXT-X-ENDLIST
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#人口:276万,
%2F1\u fileSequence\u 0.ts?alt=media
#EXT-X-ENDLIST
您也不必使用服务器端转码,您可以让上传视频的客户端来完成,从而节省大量成本


我在这里写了一个完整的教程,其中包含源代码:

如果你想创建一个类似YT的应用程序,你可以先压缩视频,我建议使用这个来管理视频压缩,我建议使用这个。我已经设法在42秒内将118毫克的视频压缩到6毫克。它还有一个很棒的演示应用程序,只需按照下面的示例操作即可

获取压缩文件后,将文件上载到存储器中,在客户端应用程序中,您将使用诸如Exo player之类的播放器播放视频url。

2020:是的,firebase存储器视频流很容易且可行。 所有其他问题都建议您使用类似HLS的协议。然而,只有当你为苹果AppStore开发了一款能够提供10分钟以上视频的应用程序时,这才是必要的

在所有其他情况下,您只需在mp4中编码视频并将其上载到firebase。然后,您的客户可以毫无问题地流式传输mp4。只需确保moov atom位于mp4文件的开头。这允许立即开始播放视频,即使视频未完全加载。 由于firebase存储支持可变位请求,用户还可以向前跳或向后跳


要测试它,只需将视频上传到firebase存储并在浏览器中打开即可。

下面的视频非常好,它使用exoplayer而不是mediaplayer或videoViewLanscape进行流式播放

以下是buid gradle应用程序文件中您需要的工具

implementation 'com.google.android.exoplayer:exoplayer:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-core:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-dash:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-hls:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-ui:r2.4.0'

据我所知,Firebase存储和CDN或视频流服务之间没有预制集成。你能提供一个链接到你看到这个的文档吗?“Firebase Storage将您的文件存储在与默认Google App Engine应用共享的Google Cloud存储桶中,使它们可以通过Firebase和Google Cloud API访问。这使您能够灵活地通过Firebase从移动客户端上传和下载文件,并使用谷歌云平台进行服务器端处理,如图像过滤或视频转码。“我还尝试使用fastly安装Firebase存储,但在设置域时失败。我认为Firebase托管可以与fastly一起工作,因为Firebase托管有自己的CDN,我认为Firebase托管没有必要。@gcas您找到解决方案了吗?感谢您提供的提示和分享您的经验。我的应用程序的要求更类似于选项2。用户将能够上传其他用户稍后能够流式传输的视频短片。我确实读过你前几天发给我的那篇文章,但我希望这两个服务之间可能会有一些更紧密的集成,这在那里没有记录。听起来像是Firebase存储和GCP为这些任务定价,我最好还是找另一个视频托管服务。我现在正在研究Sprout Video和Vimeo Pro。我也会去看看,它们很容易使用,并且可能拥有你在这一领域取得成功所需的所有东西。@gcas你到底使用了什么?我也在同一条船上使用firebase。您是否使用firebase存储和转码使用其他服务(例如zenc)
implementation 'com.google.android.exoplayer:exoplayer:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-core:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-dash:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-hls:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:r2.4.0'
implementation 'com.google.android.exoplayer:exoplayer-ui:r2.4.0'