programing

Firebase 스토리지 비디오 스트리밍

javamemo 2023. 7. 19. 21:02
반응형

Firebase 스토리지 비디오 스트리밍

저는 동영상 스트리밍 기능이 있는 앱을 만들고 있습니다.저는 소방 데이터베이스와 소방 저장소를 사용하고 있습니다.Firebase 스토리지에서 비디오 파일을 처리하는 방법에 대한 문서를 찾고 있지만 찾을 수 있는 내용이 많지 않습니다.

문서에는 파이어베이스 스토리지가 CDN 및 비디오 스트리밍을 허용하기 위해 다른 구글 앱 서비스와 함께 작동한다고 언급되어 있지만, 모든 검색은 막다른 골목으로 이어지는 것 같습니다.조언이 있습니까?

비디오 스트리밍에는 몇 가지 유형이 있으며, 이는 여기서 우리의 대답을 바꿀 수 있습니다.

  • 라이브 스트리밍(가입자가 이벤트 발생 시 시청 중)
  • Youtube 스타일(비디오 게시 및 최종 사용자 편할 때 시청)

Firebase 스토리지와 Firebase Realtime Database를 사용하여 실시간 스트리밍 Periscope 스타일의 앱을 구축한 후 이에 반대하는 것이 좋습니다. 우리는 세 개의 초크를 업로드하고 실시간 데이터베이스를 통해 동기화했습니다.(놀랍게도 잘 작동했지만) 매우 우수한 인터넷에서 최대 5초의 대기 시간이 있었고, 가장 효율적인 솔루션도 아니었습니다(결국 비디오를 업로드하고 저장하는 것뿐 아니라 트랜스코딩도 없었습니다).비디오 전송용으로 제작된 WebRTC 스타일을 사용하고 스트림을 따라 신호를 보내는 데 실시간 데이터베이스를 사용하는 것이 좋습니다.

한편, Firebase 기능을 기반으로 모바일 YT를 구축하는 것은 확실히 가능합니다.여기서 비결은 비디오를 트랜스코딩하는 것입니다(예를 들어, Zencoder 또는 Bitmovin, 여기서 더 많은: https://cloud.google.com/solutions/media/) 을 사용하여 업로드된 비디오를 다른 해상도의 더 작은 덩어리로 잘라내는 것입니다(예를 들어, iOS는 스트리밍을 위해 HLS가 필요합니다).클라이언트는 청크 정보(청크 이름, 사용 가능한 해상도, 청크 수)를 실시간 데이터베이스에 저장할 수 있으며 비디오가 진행됨에 따라 스토리지에서 해당 청크를 다운로드할 수 있습니다.

Firebase Storage에서 비디오를 스트리밍하려면 이것이 제가 찾은 가장 좋은 방법입니다.이는 비디오 파일의 크기에 따라 달라집니다.저는 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 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

2020: 예, 파이어베이스 스토리지 비디오 스트리밍은 쉽고 가능합니다.

다른 모든 질문은 HLS와 같은 프로토콜을 사용할 것을 제안합니다.그러나 이는 Apple AppStore용 앱을 개발하여 10분 이상의 동영상을 제공하는 경우에만 필요합니다.

다른 모든 경우에는 mp4로 동영상을 인코딩하여 소방서에 업로드하기만 하면 됩니다.그러면 고객은 문제 없이 mp4를 스트리밍할 수 있습니다.mp4 파일의 시작 부분에 무브 원자가 있는지 확인하십시오.이렇게 하면 비디오가 완전히 로드되지 않은 경우에도 비디오 재생을 즉시 시작할 수 있습니다.사용자는 또한 Firebase 스토리지에서 지원하는 가변 비트 요청 덕분에 앞으로 건너뛰거나 뒤로 돌아갈 수 있습니다.

테스트하려면 파이어베이스 저장소에 비디오를 업로드하고 브라우저에서 열기만 하면 됩니다.

이는 보기가 열리자마자 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()

       
    }

    }
}
}

만약 당신이 YT와 같은 앱을 만들고 싶다면, 당신은 먼저 동영상을 압축할 수 있습니다, 는 이 라이브러리를 사용하여 동영상 압축을 관리하는 것을 추천합니다, 는 이 링크에 있는 것을 추천합니다.118mg에서 6mg의 비디오를 42초 안에 압축할 수 있었습니다.그것은 또한 훌륭한 데모 앱을 가지고 있습니다, 단지 예를 따라라.

압축된 파일을 Storage에 업로드한 후 클라이언트 앱에서 Exo Player와 같은 플레이어를 사용하여 동영상 URL을 재생합니다.

아래 비디오는 미디어 플레이어나 비디오 대신에 스트리밍을 위해 exopplayer를 사용하는 것이 좋습니다.ViewLanscape 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){ 

}

아래는 당신이 필요로 하는 build gradle app 파일의 구현체입니다.

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'

Firestorage를 사용하여 비디오를 재생하려면 비디오에 대한 전체 URL만 있으면 됩니다.그런 다음 이 URL을 비디오 보기 또는 Exoplayer에 전달합니다.전체 다운로드가 필요하지 않습니다.비디오 보기는 컨텐츠를 스트리밍합니다. YT 스타일

Video SDK(https://www.videosdk.live/)가 옵션이 될 수 있습니다.동영상 통화를 위한 줌과 같은 API를 제공하며 녹화 기능을 사용하면 동영상을 실시간으로 스트리밍할 수 있습니다.

해당 콘솔에서 기록을 저장하도록 클라우드 제공자 버킷을 구성할 수 있습니다.그들은 AWS와 azure에서 이 기능을 사용할 수 있는 것 같습니다.그러나 GCP는 "곧 출시될 것"이지만 그 사이에 웹 훅을 사용하여 이 문제를 해결할 수 있는 방법이 있다는 것을 알고 있습니다.

이 솔루션은 비용이 더 많이 들 수 있지만 빠른 시작 가이드를 사용하여 쉽게 시작할 수 있습니다.

언급URL : https://stackoverflow.com/questions/37865482/firebase-storage-video-streaming

반응형