Firebase存储视频流

soat7uwm  于 2023-04-07  发布在  其他
关注(0)|答案(9)|浏览(145)

我正在开发一个具有视频流功能的应用程序。我正在使用firebase数据库和firebase存储。我试图找到一些关于firebase存储如何处理视频文件的文档,但找不到太多。
文档中提到firebase storage可以与其他谷歌应用服务配合使用,以支持CDN和视频流,但所有搜索似乎都是死路一条。有什么建议吗?

yvfmudvl

yvfmudvl1#

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

  • 实时流媒体(订阅者正在观看事件发生)
  • YouTube风格(发布视频,最终用户在方便时观看)

在使用Firebase存储和Firebase实时数据库构建了一个实时流Periscope风格的应用程序之后,我强烈建议不要使用它-我们上传了三秒钟的块并通过实时数据库同步它们。(令人惊讶的好),有~5秒的延迟非常好的互联网,它也不是最有效的解决方案(毕竟,你是在上传和存储视频,而且没有任何转码)。我建议使用一些WebRTC风格,为视频传输而构建,并使用实时数据库沿着流的旁边发送信号。
另一方面,在Firebase功能上构建移动的YT是完全可能的。这里的技巧是对视频进行转码(使用类似Zencoder或Bitmovin的东西,更多信息请参见:https://cloud.google.com/solutions/media/)将您上传的视频分割成不同分辨率的小块(以及不同的格式,例如,iOS需要HLS进行流式传输)。您的客户端可以将块信息存储在实时数据库中(块名称,可用分辨率,块数量),并且可以随着视频的进展从存储中下载所述块。

7cwmlq89

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;
    }
});

这不是最好的做事方式,但它现在对我有效,直到我能找到一个好的视频流服务。

yvt65v4c

yvt65v4c3#

2020:是的,firebase存储视频流很容易实现。

所有其他问题都建议您使用像HLS这样的协议。但是,只有当您为Apple AppStore开发的应用程序提供超过10分钟的视频时,才需要使用HLS。
在所有其他情况下,您可以简单地将视频编码为mp4并将其上传到firebase。然后您的客户端可以毫无问题地流式传输mp4。只需确保您的moov atom位于mp4文件的开头。这允许立即开始播放视频,即使它没有完全加载。用户也可以跳过或返回,这要归功于firebase存储支持的可变位请求。
要测试它,只需上传一个视频到您的firebase存储并在浏览器中打开它。

uelo1irk

uelo1irk4#

您可以在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-including-hls-and-411e4fff68fa

vxf3dgd4

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()

       
    }

    }
}
}
k75qkfdt

k75qkfdt6#

如果你想创建一个类似YT的应用程序,你可以先压缩视频,我建议使用这个library来管理视频压缩,我推荐这个link中的一个。我已经设法在42秒内将118毫克的视频压缩到6毫克。它也有一个很棒的演示应用程序,只需按照示例。
在您获得压缩文件后,将文件上传到存储,在您的客户端应用程序中,您将使用像Exo Player这样的播放器播放视频URL。

ijnw1ujt

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'
mrzz3bfm

mrzz3bfm8#

要使用firestorage播放视频,您只需要视频的完整URL。然后将此URL传递到视频视图或exoplayer中。不需要完整下载。videoview将以YT样式流式传输内容

s8vozzvw

s8vozzvw9#

视频SDK(https://www.videosdk.live/)是一个不错的选择,它为视频通话提供了一个类似缩放的API,如果你使用录制功能,你实际上是在实时播放视频。
目前,在他们的控制台中,您可以配置一个云提供商桶来存储记录。他们似乎可以为AWS和Azure提供此功能。然而,GCP“即将推出”,但我知道有一个使用webhooks的解决方案可以在此期间实现此功能。
这可能是一个更昂贵的解决方案,但它很容易得到和运行与他们的快速入门指南。

相关问题