我正在开发一个具有视频流功能的应用程序。我正在使用Firebase数据库和Firebase存储。我正在尝试查找有关Firebase存储如何处理视频文件的文档,但实际上找不到太多。
在文档中提到Firebase存储可以与其他Google应用服务一起使用,以允许CDN和视频流式传输,但是所有搜索似乎都陷入了死胡同。有什么建议吗?
我正在开发一个具有视频流功能的应用程序。我正在使用Firebase数据库和Firebase存储。我正在尝试查找有关Firebase存储如何处理视频文件的文档,但实际上找不到太多。
在文档中提到Firebase存储可以与其他Google应用服务一起使用,以允许CDN和视频流式传输,但是所有搜索似乎都陷入了死胡同。有什么建议吗?
Answers:
我认为视频流有几种类型,可能会在这里改变我们的答案:
使用Firebase Storage和Firebase Realtime Database构建了实时流式Periscope风格的应用程序后,我强烈建议不要使用它-我们上传了三秒钟的数据块,并通过Realtime Database进行了同步。虽然效果很好(令人惊讶的是),但良好的互联网存在约5秒钟的延迟,它也不是最有效的解决方案(毕竟,您正在上传和存储该视频,而且没有任何转码功能) 。我建议使用一些为视频传输而构建的WebRTC样式,并使用Realtime Database沿流发送信号。
另一方面,绝对有可能在Firebase功能上构建移动YT。这里的技巧将是对视频进行转码(使用Zencoder或Bitmovin之类的东西,更多信息在这里:https ://cloud.google.com/solutions/media/ ),将您上传的视频切成不同分辨率的小块(和不同的格式,例如,iOS需要使用HLS进行流式传输)。您的客户端可以将块信息存储在实时数据库中(块名称,可用的分辨率,块数),并且可以在视频进行时从存储中下载所述块。
如果您想从Firebase Storage中提取视频,这是我发现的最佳方法。这将取决于您的视频文件的大小。我只需要10-30mb的文件,因此此解决方案对我来说很好。只需将Firebase网址视为常规网址即可:
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;
}
});
这不是最好的处理方式,但是它对我来说一直有效,直到我能找到良好的视频流服务为止。
所有其他问题都建议您使用像HLS这样的协议。但是,仅当您为Apple AppStore开发的应用程序提供了超过10分钟的视频时才需要这样做。
在所有其他情况下,您只需将视频编码为mp4,然后将其上传到Firebase。然后,您的客户可以毫无问题地传输mp4。只要确保您的moov原子位于mp4文件的开头即可。即使未完全加载视频,也可以立即开始播放视频。用户还可以向前或向后跳过,这要归功于Firebase存储支持的可变位请求。
要对其进行测试,只需将视频上传到Firebase存储并在浏览器中将其打开。
您可以在Firebase Cloud Storage上托管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
您还没有真正有使用服务器端转码,你可以有谁上传视频做的客户端,并节省可观的成本。
我在此处编写了完整的源代码教程:https : //itnext.io/how-to-make-a-serverless-flutter-video-sharing-app-with-firebase-storage-includes-hls-and- 411e4fff68fa