我正在开发一个具有视频流功能的应用程序。我正在使用firebase数据库和firebase存储。我试图找到一些关于firebase存储如何处理视频文件的文档,但找不到太多。文档中提到firebase storage可以与其他谷歌应用服务配合使用,以支持CDN和视频流,但所有搜索似乎都是死路一条。有什么建议吗?
yvfmudvl1#
我认为有几种类型的视频流,这可能会改变我们的答案:
在使用Firebase存储和Firebase实时数据库构建了一个实时流Periscope风格的应用程序之后,我强烈建议不要使用它-我们上传了三秒钟的块并通过实时数据库同步它们。(令人惊讶的好),有~5秒的延迟非常好的互联网,它也不是最有效的解决方案(毕竟,你是在上传和存储视频,而且没有任何转码)。我建议使用一些WebRTC风格,为视频传输而构建,并使用实时数据库沿着流的旁边发送信号。另一方面,在Firebase功能上构建移动的YT是完全可能的。这里的技巧是对视频进行转码(使用类似Zencoder或Bitmovin的东西,更多信息请参见:https://cloud.google.com/solutions/media/)将您上传的视频分割成不同分辨率的小块(以及不同的格式,例如,iOS需要HLS进行流式传输)。您的客户端可以将块信息存储在实时数据库中(块名称,可用分辨率,块数量),并且可以随着视频的进展从存储中下载所述块。
7cwmlq892#
如果你想从Firebase存储流视频,这是我发现的最好的方法.这将取决于你的视频文件的大小.我只要求10- 30 MB的文件,所以这个解决方案对我很好.只要把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; } });
这不是最好的做事方式,但它现在对我有效,直到我能找到一个好的视频流服务。
yvt65v4c3#
所有其他问题都建议您使用像HLS这样的协议。但是,只有当您为Apple AppStore开发的应用程序提供超过10分钟的视频时,才需要使用HLS。在所有其他情况下,您可以简单地将视频编码为mp4并将其上传到firebase。然后您的客户端可以毫无问题地流式传输mp4。只需确保您的moov atom位于mp4文件的开头。这允许立即开始播放视频,即使它没有完全加载。用户也可以跳过或返回,这要归功于firebase存储支持的可变位请求。要测试它,只需上传一个视频到您的firebase存储并在浏览器中打开它。
uelo1irk4#
您可以在Firebase Cloud Storage上托管HLS视频。它对我来说效果很好。诀窍是修改播放列表.m3u8文件以包含存储文件夹前缀,以及播放列表中每个文件条目的?alt=media后缀:
.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-including-hls-and-411e4fff68fa
vxf3dgd45#
这是我的确切实现,它开始从存储在firebase上播放视频,只要视图打开,然后有视图消失,然后添加了一个按钮,点击后,重播视频。我有一个演示链接的关键,所以你可以看到它的工作原理。任何问题打给我。你只需要创建一个IBAction,如果你想在视频消失后的按钮。
// BackMuscles.swift // Messenger // // Created by Zach Smith on 8/12/21. // Copyright © 2021 spaceMuleFitness. All rights reserved. // import UIKit import AVKit import AVFoundation class BackMuscles: UIViewController { @IBOutlet weak var playv: UIButton! let avPlayerViewController = AVPlayerViewController() var avPlayer:AVPlayer? override func viewDidLoad() { super.viewDidLoad() self.view.addBackground() let movieUrl:NSURL? = NSURL(string: "https://firebasestorage.googleapis.com/v0/b/messenger-test-d225b.appspot.com/o/test%2FTestVideo.mov?alt=media&token=bd4ccba3-b446-43bc-809e-b1152aa3c2ff") if let url = movieUrl { self.avPlayer = AVPlayer(url: url as URL) self.avPlayerViewController.player = self.avPlayer } NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: avPlayerViewController.player?.currentItem) self.present(self.avPlayerViewController, animated: true) { () -> Void in self.avPlayerViewController.player?.play() // Do any additional setup after loading the view. } } @objc func playerDidFinishPlaying(note: NSNotification) { self.avPlayerViewController.dismiss(animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func playV(sender: UIButton) { let amovieUrl:NSURL? = NSURL(string: "https://firebasestorage.googleapis.com/v0/b/messenger-test-d225b.appspot.com/o/test%2FTestVideo.mov?alt=media&token=bd4ccba3-b446-43bc-809e-b1152aa3c2ff") if let aurl = amovieUrl { self.avPlayer = AVPlayer(url: aurl as URL) self.avPlayerViewController.player = self.avPlayer self.present(self.avPlayerViewController, animated: true) { () -> Void in self.avPlayerViewController.player?.play() } } } }
k75qkfdt6#
如果你想创建一个类似YT的应用程序,你可以先压缩视频,我建议使用这个library来管理视频压缩,我推荐这个link中的一个。我已经设法在42秒内将118毫克的视频压缩到6毫克。它也有一个很棒的演示应用程序,只需按照示例。在您获得压缩文件后,将文件上传到存储,在您的客户端应用程序中,您将使用像Exo Player这样的播放器播放视频URL。
ijnw1ujt7#
下面的视频是相当不错的,它使用exoplayer流,而不是媒体播放器或videoViewLanscape https://www.youtube.com/watch?v=s_D5C5e2Uu0
try{ BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter)); simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector); String vid = "https://www.youtube.com/watch?v=s_D5C5e2Uu0"; Uri uri= Uri.parse(vid); DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer_video"); ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); MediaSource mediaSource = new ExtractorMediaSource(uri,dataSourceFactory, extractorsFactory, null, null); videoView.setPlayer(simpleExoPlayer); simpleExoPlayer.prepare(mediaSource); simpleExoPlayer.setPlayWhenReady(true); } catch (Exception e){ }
下面是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'
mrzz3bfm8#
要使用firestorage播放视频,您只需要视频的完整URL。然后将此URL传递到视频视图或exoplayer中。不需要完整下载。videoview将以YT样式流式传输内容
s8vozzvw9#
视频SDK(https://www.videosdk.live/)是一个不错的选择,它为视频通话提供了一个类似缩放的API,如果你使用录制功能,你实际上是在实时播放视频。目前,在他们的控制台中,您可以配置一个云提供商桶来存储记录。他们似乎可以为AWS和Azure提供此功能。然而,GCP“即将推出”,但我知道有一个使用webhooks的解决方案可以在此期间实现此功能。这可能是一个更昂贵的解决方案,但它很容易得到和运行与他们的快速入门指南。
9条答案
按热度按时间yvfmudvl1#
我认为有几种类型的视频流,这可能会改变我们的答案:
在使用Firebase存储和Firebase实时数据库构建了一个实时流Periscope风格的应用程序之后,我强烈建议不要使用它-我们上传了三秒钟的块并通过实时数据库同步它们。(令人惊讶的好),有~5秒的延迟非常好的互联网,它也不是最有效的解决方案(毕竟,你是在上传和存储视频,而且没有任何转码)。我建议使用一些WebRTC风格,为视频传输而构建,并使用实时数据库沿着流的旁边发送信号。
另一方面,在Firebase功能上构建移动的YT是完全可能的。这里的技巧是对视频进行转码(使用类似Zencoder或Bitmovin的东西,更多信息请参见:https://cloud.google.com/solutions/media/)将您上传的视频分割成不同分辨率的小块(以及不同的格式,例如,iOS需要HLS进行流式传输)。您的客户端可以将块信息存储在实时数据库中(块名称,可用分辨率,块数量),并且可以随着视频的进展从存储中下载所述块。
7cwmlq892#
如果你想从Firebase存储流视频,这是我发现的最好的方法.这将取决于你的视频文件的大小.我只要求10- 30 MB的文件,所以这个解决方案对我很好.只要把Firebase网址作为一个普通的网址:
如果您想循环播放视频:
如果你想在视频开始前显示一个进度条,请这样做:
这不是最好的做事方式,但它现在对我有效,直到我能找到一个好的视频流服务。
yvt65v4c3#
2020:是的,firebase存储视频流很容易实现。
所有其他问题都建议您使用像HLS这样的协议。但是,只有当您为Apple AppStore开发的应用程序提供超过10分钟的视频时,才需要使用HLS。
在所有其他情况下,您可以简单地将视频编码为mp4并将其上传到firebase。然后您的客户端可以毫无问题地流式传输mp4。只需确保您的moov atom位于mp4文件的开头。这允许立即开始播放视频,即使它没有完全加载。用户也可以跳过或返回,这要归功于firebase存储支持的可变位请求。
要测试它,只需上传一个视频到您的firebase存储并在浏览器中打开它。
uelo1irk4#
您可以在Firebase Cloud Storage上托管HLS视频。它对我来说效果很好。诀窍是修改播放列表
.m3u8
文件以包含存储文件夹前缀,以及播放列表中每个文件条目的?alt=media
后缀:你也不必真的 * 必须 * 使用服务器端转码,你可以让上传视频的客户端做这件事,并保存可观的成本。
我在这里写了一个完整的教程和源代码:https://itnext.io/how-to-make-a-serverless-flutter-video-sharing-app-with-firebase-storage-including-hls-and-411e4fff68fa
vxf3dgd45#
这是我的确切实现,它开始从存储在firebase上播放视频,只要视图打开,然后有视图消失,然后添加了一个按钮,点击后,重播视频。
我有一个演示链接的关键,所以你可以看到它的工作原理。任何问题打给我。
你只需要创建一个IBAction,如果你想在视频消失后的按钮。
k75qkfdt6#
如果你想创建一个类似YT的应用程序,你可以先压缩视频,我建议使用这个library来管理视频压缩,我推荐这个link中的一个。我已经设法在42秒内将118毫克的视频压缩到6毫克。它也有一个很棒的演示应用程序,只需按照示例。
在您获得压缩文件后,将文件上传到存储,在您的客户端应用程序中,您将使用像Exo Player这样的播放器播放视频URL。
ijnw1ujt7#
下面的视频是相当不错的,它使用exoplayer流,而不是媒体播放器或videoViewLanscape https://www.youtube.com/watch?v=s_D5C5e2Uu0
下面是buid gradle应用程序文件中需要的实现。
mrzz3bfm8#
要使用firestorage播放视频,您只需要视频的完整URL。然后将此URL传递到视频视图或exoplayer中。不需要完整下载。videoview将以YT样式流式传输内容
s8vozzvw9#
视频SDK(https://www.videosdk.live/)是一个不错的选择,它为视频通话提供了一个类似缩放的API,如果你使用录制功能,你实际上是在实时播放视频。
目前,在他们的控制台中,您可以配置一个云提供商桶来存储记录。他们似乎可以为AWS和Azure提供此功能。然而,GCP“即将推出”,但我知道有一个使用webhooks的解决方案可以在此期间实现此功能。
这可能是一个更昂贵的解决方案,但它很容易得到和运行与他们的快速入门指南。