tencent cloud

フィードバック

Android&iOS&Windows&Mac

最終更新日:2024-07-19 15:29:07
    このドキュメントでは、主にTRTC SDKを使用してカスタムビデオキャプチャとレンダリングを実装する方法を紹介します。ビデオキャプチャとビデオレンダリングの2つの部分に分かれています。

    ビデオキャプチャのカスタマイズ

    TRTC SDKのカスタムビデオキャプチャ機能の有効化は、機能の有効化とSDKへのビデオフレームの送信の2つの手順に分かれています。具体的なAPIの使用手順は次のとおりです。また、対応するプラットホームのAPI-Exampleも提供します:

    カスタムビデオキャプチャ機能の有効化

    まず、TRTCCloudのenableCustomVideoCaptureインターフェースを呼び出して、TRTC SDKのカスタムビデオキャプチャ機能を有効にする必要があります。有効にすると、TRTC SDK独自のカメラ取得および画像処理ロジックがスキップされ、エンコードおよび送信機能のみが保持されます。サンプルコードは次のとおりです:
    Android
    iOS&Mac
    Windows
    TRTCCloud mTRTCCloud = TRTCCloud.shareInstance();
    mTRTCCloud.enableCustomVideoCapture(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, true);
    
    self.trtcCloud = [TRTCCloud sharedInstance];
    [self.trtcCloud enableCustomVideoCapture:TRTCVideoStreamTypeBig enable:YES];
    
    liteav::ITRTCCloud* trtc_cloud = liteav::ITRTCCloud::getTRTCShareInstance();
    trtc_cloud->enableCustomVideoCapture(TRTCVideoStreamType::TRTCVideoStreamTypeBig, true);
    

    カスタムビデオフレームの送信

    次に、TRTCCloudのsendCustomVideoDataインターフェースを使用して、TRTC SDKに独自のビデオデータを送信できます。サンプルコードは次のとおりです:
    説明:
    不要な性能の低下を回避するために、TRTC SDKに入力されるビデオデータには、プラットフォームごとに異なるフォーマット要件があります。詳細については、APIドキュメント:簡体字中国語Englishを参照してください。
    Android
    iOS&Mac
    Windows
    // Androidプラットフォームには、BufferとTextureの2つのスキームがあります。ここでは、Textureスキームを例として取り上げます。これを推薦します!
    TRTCCloudDef.TRTCVideoFrame videoFrame = new TRTCCloudDef.TRTCVideoFrame();
    videoFrame.texture = new TRTCCloudDef.TRTCTexture();
    videoFrame.texture.textureId = textureId;
    videoFrame.texture.eglContext14 = eglContext;
    videoFrame.width = width;
    videoFrame.height = height;
    videoFrame.timestamp = timestamp;
    videoFrame.pixelFormat = TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D;
    videoFrame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE;
    mTRTCCloud.sendCustomVideoData(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, videoFrame);
    
    // iOS/Macプラットフォームでは、カメラによってネイティブに取得されたビデオ形式はNV12であり、ネイティブにサポートされ、最高の性能を発揮するビデオフレーム形式はCVPixelBufferRefであり、I420およびOpenGL 2Dテクスチャ形式を同時にサポートします。ここで、CVPixelBufferRefを例として取り上げます。これを推薦します。
    TRTCVideoFrame *videoFrame = [[TRTCVideoFrame alloc] init];
    videoFrame.pixelFormat = TRTCVideoPixelFormat_NV12;
    videoFrame.bufferType = TRTCVideoBufferType_PixelBuffer;
    videoFrame.pixelBuffer = imageBuffer;
    videoFrame.timestamp = timeStamp;
    
    [[TRTCCloud sharedInstance] sendCustomVideoData:TRTCVideoStreamTypeBig frame:videoFrame];
    
    // Windowsプラットフォームは現在、Bufferスキームのみをサポートしており、この方法で機能を実装することを推薦します。
    liteav::TRTCVideoFrame frame;
    frame.timestamp = getTRTCShareInstance()->generateCustomPTS();
    frame.videoFormat = liteav::TRTCVideoPixelFormat_I420;
    frame.bufferType = liteav::TRTCVideoBufferType_Buffer;
    frame.length = buffer_size;
    frame.data = array.data();
    frame.width = YUV_WIDTH;
    frame.height = YUV_HEIGHT;
    getTRTCShareInstance()->sendCustomVideoData(&frame);
    
    

    ビデオレンダリングのカスタマイズ

    カスタムレンダリングは、主にローカルプレビュー画面のレンダリングとリモートユーザー画面のレンダリングに分けられています。基本的な原則として、ローカル/リモートのカスタムレンダリングコールバックを設定し、TRTC SDKは対応するビデオフレーム(つまり、TRTCVideoFrame)をコールバック関数onRenderVideoFrameに渡し、開発者は受信したビデオフレームに応じてレンダリングをカスタマイズできます。このプロセスには、特定のOpenGL基盤が必要です。また、対応するプラットフォームのAPI-Exampleも提供しています:

    ローカルプレビュー画面のレンダリングコールバックの設定

    Android
    iOS&Mac
    Windows
    mTRTCCloud.setLocalVideoRenderListener(TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE, new TRTCCloudListener.TRTCVideoRenderListener() {
    @Override
    public void onRenderVideoFrame(String suserId int streamType, TRTCCloudDef.TRTCVideoFrame frame) {
    // 詳細については、TRTC-API-Exampleのカスタムレンダリングのツールクラスをご参照ください:com.tencent.trtc.mediashare.helper.CustomFrameRender
    }
    });
    
    self.trtcCloud = [TRTCCloud sharedInstance];
    [self.trtcCloud setLocalVideoRenderDelegate:self pixelFormat:TRTCVideoPixelFormat_NV12 bufferType:TRTCVideoBufferType_PixelBuffer];
    
    ```
    // 具体的な実装については、TRTC-API-Example-Qtのtest_custom_render.cppを参照してください。
    void TestCustomRender::onRenderVideoFrame(
    const char* userId,
    liteav::TRTCVideoStreamType streamType,
    liteav::TRTCVideoFrame* frame) {
    if (gl_yuv_widget_ == nullptr) {
    return;
    }
    
    if (streamType == liteav::TRTCVideoStreamType::TRTCVideoStreamTypeBig) {
    // レンダリングウィンドウを調整します
    emit renderViewSize(frame->width, frame->height);
    // ビデオフレームを描画します
    gl_yuv_widget_->slotShowYuv(reinterpret_cast<uchar*>(frame->data),
    frame->width, frame->height);
    }
    }
    ```
    

    リモートユーザー画面のレンダリングコールバックの設定

    Android
    iOS&Mac
    Windows
    mTRTCCloud.setRemoteVideoRenderListener(userId, TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_I420, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_ARRAY, new TRTCCloudListener.TRTCVideoRenderListener() {
    @Override
    public void onRenderVideoFrame(String userId, int streamType, TRTCCloudDef.TRTCVideoFrame frame) {
    // 詳細については、TRTC-API-Exampleのカスタムレンダリングのツールクラスをご参照ください:com.tencent.trtc.mediashare.helper.CustomFrameRender
    }
    });
    
    - (void)onRenderVideoFrame:(TRTCVideoFrame *)frame
    userId:(NSString *)userId
    streamType:(TRTCVideoStreamType)streamType
    {
    //userIdがnilの場合はローカル画面、nilでない場合はリモート画面です
    CFRetain(frame.pixelBuffer);
    __weak __typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
    TestRenderVideoFrame* strongSelf = weakSelf;
    UIImageView* videoView = nil;
    if (userId) {
    videoView = [strongSelf.userVideoViews objectForKey:userId];
    }
    else{
    videoView = strongSelf.localVideoView;
    }
    videoView.image = [UIImage imageWithCIImage:[CIImage imageWithCVImageBuffer:frame.pixelBuffer]];
    videoView.contentMode = UIViewContentModeScaleAspectFit;
    CFRelease(frame.pixelBuffer);
    });
    }
    
    ```
    // 具体的な実装については、TRTC-API-Example-Qtのtest_custom_render.cppを参照してください。
    void TestCustomRender::onRenderVideoFrame(
    const char* userId,
    liteav::TRTCVideoStreamType streamType,
    liteav::TRTCVideoFrame* frame) {
    if (gl_yuv_widget_ == nullptr) {
    return;
    }
    
    if (streamType == liteav::TRTCVideoStreamType::TRTCVideoStreamTypeBig) {
    // レンダリングウィンドウを調整します
    emit renderViewSize(frame->width, frame->height);
    // ビデオフレームを描画します
    gl_yuv_widget_->slotShowYuv(reinterpret_cast<uchar*>(frame->data),
    frame->width, frame->height);
    }
    }
    ```
    
    お問い合わせ

    カスタマーサービスをご提供できるため、ぜひお気軽にお問い合わせくださいませ。

    テクニカルサポート

    さらにサポートが必要な場合は、サポートチケットを送信して弊社サポートチームにお問い合わせください。24時間365日のサポートをご提供します。

    電話サポート(24 時間365日対応)