TRTCPublishBigStreamToCdn
또는 TRTCPublishSubStreamToCdn
으로 설정합니다. 전자는 사용자의 기본 스트림(일반적으로 카메라)을 게시하는 데 사용되며 후자는 사용자의 서브 스트림(일반적으로 화면)을 게시하는 데 사용됩니다.rtmp://
로 시작)로 설정합니다. Tencent Cloud CDN에 게시하는 경우 isInternalLine을 true로 설정합니다. 그렇지 않으면 false로 설정하십시오.TRTCStreamEncoderParam
및 TRTCStreamMixingConfig
를 비워 둡니다.```// 로컬 사용자의 스트림을 CDN에 게시TRTCCloudDef.TRTCPublishTarget target = new TRTCCloudDef.TRTCPublishTarget();target.mode = TRTC_PublishBigStream_ToCdn;TRTCCloudDef.TRTCPublishCdnUrl cdnUrl= new TRTCCloudDef.TRTCPublishCdnUrl();cdnUrl.rtmpUrl = "rtmp://tencent/live/bestnews";cdnUrl.isInternalLine = true;target.cdnUrlList.add(cdnUrl);mTRTCCloud.startPublishMediaStream(target, null, null);```
```// 로컬 사용자의 스트림을 CDN에 게시TRTCPublishTarget* target = [[TRTCPublishTarget alloc] init];target.mode = TRTCPublishBigStreamToCdn;TRTCPublishCdnUrl* cdnUrl = [[TRTCPublishCdnUrl alloc] init];cdnUrl.rtmpUrl = @"rtmp://tencent/live/bestnews";cdnUrl.isInternalLine = YES;NSMutableArray* cdnUrlList = [NSMutableArray new];[cdnUrlList addObject:cdnUrl];target.cdnUrlList = cdnUrlList;[_trtcCloud startPublishMediaStream:target encoderParam:nil mixingConfig:nil];```
```// 로컬 사용자의 스트림을 CDN에 게시TRTCPublishTarget target;target.mode = TRTCPublishMode::TRTCPublishBigStreamToCdn;TRTCPublishCdnUrl* cdn_url_list = new TRTCPublishCdnUrl[1];cdn_url_list[0].rtmpUrl = "rtmp://tencent/live/bestnews";cdn_url_list[0].isInternalLine = true;target.cdnUrlList = cdn_url_list;target.cdnUrlListSize = 1;trtc->startPublishMediaStream(&target, nullptr, nullptr);delete[] cdn_url_list;```
TRTCStreamEncoderParam
및 TRTCStreamMixingConfig
매개변수를 사용하면 스트림 믹싱 및 트랜스 코딩에 대한 세부 정보를 결정할 수 있습니다.TRTCStreamMixingConfig
) 및 트랜스 코딩 매개변수(TRTCStreamEncoderParam
)에 따라 다시 인코딩됩니다. 그 후에 CDN에 게시됩니다. 이 모드에서는 추가 트랜스 코딩 요금이 부과됩니다.TRTCPublishMixStreamToCdn
으로 설정합니다.
2. TRTCPublishTarget 객체의 cdnUrlList를 하나 이상의 CDN 주소(보통 rtmp://
로 시작)로 설정합니다. Tencent Cloud CDN에 게시하는 경우 isInternalLine을 true로 설정합니다. 그렇지 않으면 false로 설정하십시오.
3. 인코딩 매개변수 설정(TRTCStreamEncoderParam
):
비디오 인코딩 매개변수: 해상도, 프레임 레이트(15fps 권장), 비트 레이트 및 GOP(3초 권장)를 지정합니다. 비트 레이트와 해상도는 적절한 매칭 관계가 있습니다. 아래 표에는 몇 가지 권장 해상도 및 비트 레이트 설정이 나와 있습니다.
오디오 인코딩 매개변수: startLocalAudio를 호출할 때 전달한 AudioQuality 값에 따라 코덱, 비트 레이트, 샘플링 레이트 및 사운드 채널을 지정합니다.videoEncodedWidth | videoEncodedHeight | videoEncodedFPS | videoEncodedGOP | videoEncodedKbps |
640 | 360 | 15 | 3 | 800kbps |
960 | 540 | 15 | 3 | 1200kbps |
1280 | 720 | 15 | 3 | 1500kbps |
1920 | 1080 | 15 | 3 | 2500kbps |
TRTCAudioQuality | audioEncodedSampleRate | audioEncodedChannelNum | audioEncodedKbps | audioEncodedCodecType |
TRTCAudioQualitySpeech | 48000 | 1 | 50 | 0 |
TRTCAudioQualityDefault | 48000 | 1 | 50 | 0 |
TRTCAudioQualityMusic | 48000 | 2 | 60 | 2 |
TRTCStreamMixingConfig
):
오디오 믹싱 매개변수(audioMixUserList): 이 매개변수를 비워 두어 방의 모든 오디오를 믹싱하거나 오디오를 믹싱하려는 사용자의 ID로 설정할 수 있습니다.
비디오 레이아웃 매개변수(videoLayoutList): 비디오 레이아웃은 배열에 의해 결정됩니다. 배열의 각 TRTCVideoLayout 요소는 비디오 창의 위치, 크기 및 배경색을 결정합니다. fixedVideoUser를 지정하면 TRTCVideoLayout 요소에 의해 정의된 창에 특정 사용자의 비디오가 표시됩니다. fixedVideoUser를 null로 설정하면 TRTC 서버가 창에 표시할 비디오를 결정합니다.사례1: 4명의 사용자 스트림을 혼합하고 이미지를 배경으로 사용layout1: 사용자 jerry의 카메라 비디오의 위치(캔버스의 위쪽 절반)와 크기(640x480)를 지정합니다.layout2, layout3, layout4: 사용자 Id가 지정되지 않았기 때문에 TRTC는 자체 규칙에 따라 창에 다른 세 사용자의 비디오를 표시합니다.사례2: 한 사용자의 카메라 비디오와 화면에 다른 세 사용자의 카메라 비디오를 혼합layout1: 사용자 jerry의 화면의 위치(왼쪽)와 크기(1280x720)를 지정합니다. 사용된 렌더링 모드는 가로 세로 맞춤(Fit)이며 배경색은 검정색입니다.layout2: 사용자 jerry의 카메라 비디오의 위치(오른쪽 상단)와 크기(300x200)를 지정합니다. 사용된 렌더링 모드는 화면 채우기(Fill)입니다.layout3, layout4, layout5: 사용자 Id가 지정되지 않았기 때문에 TRTC는 자체 규칙에 따라 창에 다른 세 사용자의 비디오를 표시합니다.
```// 게시 모드를 TRTC_PublishMixedStream_ToCdn으로 지정TRTCCloudDef.TRTCPublishTarget target = new TRTCCloudDef.TRTCPublishTarget();target.mode = TRTC_PublishMixedStream_ToCdn;// 게시된 CDN 푸시 스트림 주소 지정TRTCCloudDef.TRTCPublishCdnUrl cdnUrl= new TRTCCloudDef.TRTCPublishCdnUrl();cdnUrl.rtmpUrl = "rtmp://tencent/live/bestnews";cdnUrl.isInternalLine = true;target.cdnUrlList.add(cdnUrl);// 믹싱된 오디오/비디오 스트림의 2차 인코딩 매개변수 설정TRTCCloudDef.TRTCStreamEncoderParam encoderParam= new TRTCCloudDef.TRTCStreamEncoderParam();encoderParam.videoEncodedWidth = 1280;encoderParam.videoEncodedHeight = 720;encoderParam.videoEncodedFPS = 15;encoderParam.videoEncodedGOP = 3;encoderParam.videoEncodedKbps = 1000;encoderParam.audioEncodedSampleRate = 48000;encoderParam.audioEncodedChannelNum = 1;encoderParam.audioEncodedKbps = 50;encoderParam.audioEncodedCodecType = 0;// 화면의 레이아웃 매개변수 설정TRTCCloudDef.TRTCStreamMixingConfig mixingConfig =new TRTCCloudDef.TRTCStreamMixingConfig();TRTCCloudDef.TRTCVideoLayout layout1 = new TRTCCloudDef.TRTCVideoLayout();layout1.zOrder = 0;layout1.x = 0;layout1.y = 0;layout1.width = 720;layout1.height = 1280;layout1.fixedVideoStreamType = TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_SUB;layout1.fixedVideoUser.intRoomId = 1234;layout1.fixedVideoUser.userId = "mike";TRTCCloudDef.TRTCVideoLayout layout2 = new TRTCCloudDef.TRTCVideoLayout();layout2.zOrder = 0;layout2.x = 1300;layout2.y = 0;layout2.width = 300;layout2.height = 200;layout2.fixedVideoStreamType = TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG;layout2.fixedVideoUser.intRoomId = 1234;layout2.fixedVideoUser.userId = "mike";TRTCCloudDef.TRTCVideoLayout layout3 = new TRTCCloudDef.TRTCVideoLayout();layout3.zOrder = 0;layout3.x = 1300;layout3.y = 220;layout3.width = 300;layout3.height = 200;layout3.fixedVideoStreamType = TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_SUB;layout3.fixedVideoUser = null;mixingConfig.videoLayoutList.add(layout1);mixingConfig.videoLayoutList.add(layout2);mixingConfig.videoLayoutList.add(layout3);mixingConfig.audioMixUserList = null;// 혼합 스트림 시작mTRTCCloud.startPublishMediaStream(target, encoderParam, mixingConfig);```
```// 게시 모드를 TRTCPublishMixStreamToCdn으로 지정TRTCPublishTarget* target = [[TRTCPublishTarget alloc] init];target.mode = TRTCPublishMixStreamToCdn;// 게시된 CDN 푸시 스트림 주소 지정TRTCPublishCdnUrl* cdnUrl = [[TRTCPublishCdnUrl alloc] init];cdnUrl.rtmpUrl = @"rtmp://tencent/live/bestnews";cdnUrl.isInternalLine = YES;NSMutableArray* cdnUrlList = [NSMutableArray new];[cdnUrlList addObject:cdnUrl];target.cdnUrlList = cdnUrlList;// 믹싱된 오디오/비디오 스트림의 2차 인코딩 매개변수 설정TRTCStreamEncoderParam* encoderParam = [[TRTCStreamEncoderParam alloc] init];encoderParam.videoEncodedWidth = 1280;encoderParam.videoEncodedHeight = 720;encoderParam.videoEncodedFPS = 15;encoderParam.videoEncodedGOP = 3;encoderParam.videoEncodedKbps = 1000;encoderParam.audioEncodedSampleRate = 48000;encoderParam.audioEncodedChannelNum = 1;encoderParam.audioEncodedKbps = 50;encoderParam.audioEncodedCodecType = 0;// 화면의 레이아웃 매개변수 설정TRTCStreamMixingConfig* config = [[TRTCStreamMixingConfig alloc] init];NSMutableArray* videoLayoutList = [NSMutableArray new];TRTCVideoLayout* layout1 = [[TRTCVideoLayout alloc] init];layout1.zOrder = 0;layout1.rect = CGRectMake(0, 0, 720, 1280);layout1.fixedVideoStreamType = TRTCVideoStreamTypeSub;layout1.fixedVideoUser.intRoomId = 1234;layout1.fixedVideoUser.userId = @"mike";TRTCVideoLayout* layout2 = [[TRTCVideoLayout alloc] init];layout2.zOrder = 0;layout2.rect = CGRectMake(1300, 0, 300, 200);layout2.fixedVideoStreamType = TRTCVideoStreamTypeBig;layout2.fixedVideoUser.intRoomId = 1234;layout2.fixedVideoUser.userId = @"mike";TRTCVideoLayout* layout3 = [[TRTCVideoLayout alloc] init];layout3.zOrder = 0;layout3.rect = CGRectMake(1300, 220, 300, 200);layout3.fixedVideoStreamType = TRTCVideoStreamTypeSub;layout3.fixedVideoUser = nil;[videoLayoutList addObject:layout1];[videoLayoutList addObject:layout2];[videoLayoutList addObject:layout3];config.videoLayoutList = videoLayoutList;config.audioMixUserList = nil;// 혼합 스트림 시작[_trtcCloud startPublishMediaStream:target encoderParam:encoderParam mixingConfig:config];```
```// 게시 모드를 TRTCPublishMixStreamToCdn으로 지정TRTCPublishTarget target;target.mode = TRTCPublishMode::TRTCPublishMixStreamToCdn;// 게시된 CDN 푸시 스트림 주소 지정TRTCPublishCdnUrl* cdn_url = new TRTCPublishCdnUrl[1];cdn_url[0].rtmpUrl = "rtmp://tencent/live/bestnews";cdn_url[0].isInternalLine = true;target.cdnUrlList = cdn_url;target.cdnUrlListSize = 1;// 믹싱된 오디오/비디오 스트림의 2차 인코딩 매개변수 설정TRTCStreamEncoderParam encoder_param;encoder_param.videoEncodedWidth = 1280;encoder_param.videoEncodedHeight = 720;encoder_param.videoEncodedFPS = 15;encoder_param.videoEncodedGOP = 3;encoder_param.videoEncodedKbps = 1000;encoder_param.audioEncodedSampleRate = 48000;encoder_param.audioEncodedChannelNum = 1;encoder_param.audioEncodedKbps = 50;encoder_param.audioEncodedCodecType = 0;// 화면의 레이아웃 매개변수 설정TRTCStreamMixingConfig config;TRTCVideoLayout* video_layout_list = new TRTCVideoLayout[3];TRTCUser* fixedVideoUser0 = new TRTCUser();fixedVideoUser0->intRoomId = 1234;fixedVideoUser0->userId = "mike";video_layout_list[0].zOrder = 0;video_layout_list[0].rect.left = 0;video_layout_list[0].rect.top = 0;video_layout_list[0].rect.right = 720;video_layout_list[0].rect.bottom = 1280;video_layout_list[0].fixedVideoStreamType =TRTCVideoStreamType::TRTCVideoStreamTypeSub;video_layout_list[0].fixedVideoUser = fixedVideoUser0;TRTCUser* fixedVideoUser1 = new TRTCUser();fixedVideoUser1->intRoomId = 1234;fixedVideoUser1->userId = "mike";video_layout_list[1].zOrder = 0;video_layout_list[1].rect.left = 1300;video_layout_list[1].rect.top = 0;video_layout_list[1].rect.right = 300;video_layout_list[1].rect.bottom = 200;video_layout_list[1].fixedVideoStreamType =TRTCVideoStreamType::TRTCVideoStreamTypeBig;video_layout_list[1].fixedVideoUser = fixedVideoUser1;video_layout_list[2].zOrder = 0;video_layout_list[2].rect.left = 1300;video_layout_list[2].rect.top = 220;video_layout_list[2].rect.right = 300;video_layout_list[2].rect.bottom = 200;video_layout_list[2].fixedVideoStreamType =TRTCVideoStreamType::TRTCVideoStreamTypeSub;video_layout_list[2].fixedVideoUser = nullptr;config.videoLayoutList = video_layout_list;config.videoLayoutListSize = 3;config.audioMixUserList = nullptr;// 혼합 스트림 시작trtc->startPublishMediaStream(&target, &encoder_param, &config);delete fixedVideoUser0;delete fixedVideoUser1;delete[] video_layout_list;```
onCdnStreamStateChanged
콜백 이벤트를 수신하여 CDN 작업 중계의 최신 상태를 얻을 수 있습니다.taskid
를 전달하여 updatePublishMediaStream
을 호출하기만 하면 됩니다. 게시 프로세스의 안정성을 보장하기 위해 단일 스트림 게시에서 오디오만 또는 비디오만 믹싱 및 게시로 전환할 수 없습니다. 기본적으로 단일 스트림을 게시하면 오디오 및 비디오 데이터가 모두 게시됩니다. 혼합 스트림 게시로 전환하는 경우 오디오와 비디오도 모두 게시해야 합니다.TRTCStreamEncodeParam
에서 오디오 매개변수를 설정하지 말고 TRTCStreamMixingConfig
의 audioMixUserList
를 비워 두십시오.TRTCStreamMixingConfig
의 watermarkList
를 사용하여 워터마크를 설정할 수 있습니다.TRTCVideoLayout
의 fixedVideoStreamType
을 TRTCVideoStreamTypeSub
로 설정합니다.startPublishMediaStream
을 호출한 앵커가 방을 나갔습니다.stopPublishMediaStream
을 호출하여 스트림 믹싱을 중지합니다.
문제 해결에 도움이 되었나요?