构建了一个应用程序,可以在几个小时内一起在线观看电影(里面有源代

2022-08-01  本文已影响0人  蜗牛是不是牛

这个项目是如何开始的

我和我女朋友分居,所以我们不能经常见面。有一天,我们在视频聊天时,她说:“嘿,距离上次我们一起去电影院已经有一段时间了,我们什么时候才能再一起看电影……”

她是对的。这已经有一段时间...

虽然我们还不能马上见面,但也许我们可以一起在网上看场电影。我知道有很多应用程序可供人们一起在线观看电影。特别是疫情开始以来,越来越多的此类应用和服务被推出,以满足人们保持联系的需求。但是,我的脑海里突然冒出一个念头:如果我能自己造一个,那不是很酷吗?

由于我是ZEGOCLOUD的开发人员,这是一个基于云的实时交互 API 平台,可帮助开发人员快速将实时音频/视频和应用内聊天功能构建到任何应用程序中,我拥有构建此类所需的所有东西一起看的应用程序。

然后,我无法抗拒这个想法,开始建造。

...

几个小时后,我得到了这样的东西:

作为一名开发人员,我喜欢构建事物,并且我喜欢分享事物是如何构建的。因此,在接下来的部分中,我将概述实现的一些重要步骤,并且在文章的最后,我还提供了整个项目的源代码的链接。

实施

设置开发环境

先决条件

在开始使用 ZEGOCLOUD 构建之前,需要先完成以下几件事。

现在,我们可以开始编码了!

功能概述

这将是一个具有以下功能的简单应用程序:

此决定中的考虑是,如果电影从参与者之一的设备播放并流式传输到房间,则流式传输延迟可能会导致两个参与者之间出现可感知的不同步问题。但是,如果电影是从单独的设备播放和流式传输的,那么两个参与者都将从云订阅和播放电影流,并且出现可感知的不同步问题的可能性会低得多。

电影流媒体端 - 播放电影并将其流式传输到房间

第一步:创建ZegoExpressEngine实例。

/// Define the ZegoExpressEngine object
ZegoExpressEngine engine;
/// Specify the AppID and AppSign for SDK authentication
/// AppID Format:123456789L
long appID = ; 
/// AppSign Format:"0123456789012345678901234567890123456789012345678901234567890123"
String appSign = "";
/// Create a ZegoExpressEngine instance
engine = ZegoExpressEngine.createEngine(appID, appSign, true, ZegoScenario.GENERAL, getApplication(), null); 

第 2 步:为引擎启用自定义视频捕获。

ZegoCustomVideoCaptureConfig videoCaptureConfig = new ZegoCustomVideoCaptureConfig();
// Use RAW_DATA as video buffer data type
videoCaptureConfig.bufferType = ZegoVideoBufferType.RAW_DATA;  engine.enableCustomVideoCapture(true, videoCaptureConfig, ZegoPublishChannel.MAIN);

步骤 3:为自定义视频捕获设置回调处理程序并实现回调方法。

// Set the engine itself as the callback handler object
engine.setCustomVideoCaptureHandler(new IZegoCustomVideoCaptureHandler() {    
     @Override     
     public void onStart(ZegoPublishChannel channel) {         
     // On receiving the onStart callback, start to capture video and send the captured video frame data to the ZegoExpressEngine.

        ...     
     }    
      @Override     
      public void onStop(ZegoPublishChannel channel) {         
      // On receiving the onStop callback, stop the video capture process.
        ...     
      }
  });

第 4 步: 加入房间。

/// Create a user
ZegoUser user = new ZegoUser("userA"); 
/// Join a room
engine.loginRoom("room", user);

第 5 步:ZegoMediaPlayer. 通过设置该处理程序,您可以通过回调接收正在播放的电影的视频帧数据onVideoFrame

mZegoMediaPlayer.setVideoHandler(
    new IZegoMediaPlayerVideoHandler() {
        @Override
        public void onVideoFrame(ZegoMediaPlayer zegoMediaPlayer, ByteBuffer[] byteBuffers, int[] ints, ZegoVideoFrameParam zegoVideoFrameParam) { 
        if (RoomManager.getInstance().isCanSenRawData()) {
            int totalDataLength = byteBuffers[0].capacity();
            if (tempByteBuffer == null || tempByteBuffer.capacity() != totalDataLength) {
                tempByteBuffer = ByteBuffer.allocateDirect(byteBuffers[0].capacity()).put(byteBuffers[0]);
            } else {
                tempByteBuffer.clear();
                tempByteBuffer.put(byteBuffers[0]);
            }
            ZegoSDKManager.getInstance().getStreamService().sendCustomVideoCaptureRawData(tempByteBuffer, tempByteBuffer.capacity(), zegoVideoFrameParam);
            }
        }
    }, ZegoVideoFrameFormat.RGBA32);

第 6 步:开始流发布。从指定的文件路径(本地文件路径或指向 Internet 媒体资源的 URL)加载电影,然后开始播放电影。

/// Start publishing the stream
engine.startPublishingStream("streamMovie");

mZegoMediaPlayer.loadResource(path, new IZegoMediaPlayerLoadResourceCallback() {
    @Override
    public void onLoadResourceCallback(int code) {
        if (code == 0) {
            mZegoMediaPlayer.start();
            if (callback != null) {
                callback.onLoadResourceCallback(code);
            }
        }
    }
});

第七步:当房间内没有其他参与者或正在发布流的参与者离开房间时,停止发布流,并触发停止自定义视频采集的回调。

ZegoSDKManager.getInstance().getDeviceService().setCustomVideoCaptureHandler(new IZegoVideoCaptureCallback() {
    @Override
    public void onStart(ZegoPublishChannel channel) {
        canSenRawData = true;
    }

    @Override
    public void onStop(ZegoPublishChannel channel) {
        canSenRawData = false;
    }
});

观影端——订阅影流一起看,视频聊天,文字聊天

要实现watch together功能,我们需要实现以下功能:

电影播放的高级程序逻辑:

如果观众试图加入一个不存在或没有电影流媒体的房间,他们将被提升一条消息Room doesn't exist

如果指定房间已满,则房间登录失败,并通知用户。

/// start playing stream
engine.startPlayingStream("stream1", new ZegoCanvas(play_view));

setRoomExtraInfo下表显示了您可以传递给该方法以发送不同通知的键值参数:

视频聊天的高级程序逻辑:

/// Switch between the front/rear camera
expressEngine.useFrontCamera(front);

/// Turn on/off the camera
expressEngine.enableCamera(enable);

/// Mute or unmute the microphone
expressEngine.muteMicrophone(!enable);

文本聊天的高级程序逻辑:
/// Send broadcast messages
engine.sendBroadcastMessage(roomID, msg, new IZegoIMSendBroadcastMessageCallback() {
   @Override     
   public void onIMSendBroadcastMessageResult(int errorCode, long messageID) {   
    /// Returned result of sending broadcast messages       
   }
 });

  /// reveice message
public void onIMRecvBroadcastMessage(String roomID, ArrayList<ZegoBroadcastMessageInfo> messageList){          
}

完成后的应用程序是什么样的(源代码下载链接附在下面)

电影流光面

观察者侧

如果您愿意,您可以安装以下演示应用程序并自行尝试:

下载演示

如何使用演示:

  1. 首先启动电影流媒体,选择一部电影,然后设置房间 ID。
  2. 启动查看器应用程序,然后通过指定相同的房间 ID 加入房间。

下载源代码

结论

通过本次分享,希望大家会发现,做一个一起看电影的APP其实并没有大家想象的那么难。准备好自己建造一个了吗?

作者:大卫雷洛
链接:https://dev.to/davidrelo/movies-together-online-in-a-few-hours-source-code-inside-40o0

上一篇 下一篇

猜你喜欢

热点阅读