MLVBLiveRoom
component to help you quickly implement the host competition feature. To better cater to your needs, Tencent Cloud has launched an RTC-based host competition scheme and offered simpler and more flexible V2 APIs.Item | RTMP | WebRTC |
Protocol | Based on TCP | Based on UDP (more suitable for streaming) |
QoS | Poor adaptability to bad network connection | Video streaming unaffected with 50% packets loss; audio mic connect unaffected with 70% packets loss |
Region | Chinese mainland | Worldwide |
Tencent Cloud products used | MLVB, CSS | MLVB, CSS, TRTC |
Price | 0.0028 USD/min |
V2TXLivePusher
(publishing) and V2TXLivePlayer
(playback) to power larger-scale live streaming scenarios with greater flexibility and lower latency. Hosts can use the capabilities provided by the APIs for RTC-based publishing. Audience, by default, play streams via CDNs, whose cost is relatively low. To compete, hosts only need to play each other’s stream. To enable RTC-based host competition, you must activate TRTC.
Below are the UI views of the MLVB-API-Example demo.Host A (Phone A) | Host B (Phone B) | Audience of Host A (Phone C) |
| | |
Host A (Phone A) | Host B (Phone B) | Audience of Host A (Phone C) |
| | |
V2TXLivePusher
to publish a stream. For how to splice a publishing URL, please see Publish/Playback URL.V2TXLivePusher pusher = new V2TXLivePusherImpl(this, V2TXLiveMode.TXLiveMode_RTC);pushURLA= "trtc://cloud.tencent.com/push/streamid?sdkappid=1400188888&userId=A&usersig=xxx";pusher.startPush(pushURLA);
V2TXLivePusher *pusher = [[V2TXLivePusher alloc] initWithLiveMode:V2TXLiveMode_RTC];NSString *pushURLA = @"trtc://cloud.tencent.com/push/streamid?sdkappid=1400188888&userId=A&usersig=xxx";[pusher startPush:pushURLA];
V2TXLivePusher
to publish a stream. For how to splice a publishing URL, please see Publish/Playback URL.V2TXLivePusher pusher = new V2TXLivePusherImpl(this, V2TXLiveMode.TXLiveMode_RTC);pushURLB "trtc://cloud.tencent.com/push/streamid?sdkappid=1400188888&userId=B&usersig=xxx";pusher.startPush(pushURLB);
V2TXLivePusher *pusher = [[V2TXLivePusher alloc] initWithLiveMode:V2TXLiveMode_RTC];NSString *pushURLB = @"trtc://cloud.tencent.com/push/streamid?sdkappid=1400188888&userId=B&;usersig=xxx";[pusher startPush:pushURLB];
V2TXLivePlayer
to play each other’s stream and start RTC-based competition. For how to splice a playback URL, please see Publish/Playback URL.// Host AV2TXLivePlayer player = new V2TXLivePlayerImpl(mContext);playURLB = "trtc://cloud.tencent.com/play/streamid?sdkappid=1400188888&userId=B&usersig=xxx&appscene=live"player.startPlay(playURLB);...// Host BV2TXLivePlayer player = new V2TXLivePlayerImpl(mContext);playURLA= "trtc://cloud.tencent.com/play/streamid?sdkappid=1400188888&userId=A&usersig=xxx&appscene=live"player.startPlay(playURLA);
// Host AV2TXLivePlayer *player = [[V2TXLivePlayer alloc] init];NSString *playURLB = "trtc://cloud.tencent.com/play/streamid?sdkappid=1400188888&userId=B&usersig=xxx&appscene=live"[player setRenderView:view];[player startPlay:playURLB];...// Host BV2TXLivePlayer *player = [[V2TXLivePlayer alloc] init];NSString *playURLA = "trtc://cloud.tencent.com/play/streamid?sdkappid=1400188888&userId=A&usersig=xxx&appscene=live"[player setRenderView:view];[player startPlay:playURLA];
V2TXLivePlayer
to play host B’s stream, and host B’s audience calls V2TXLivePlayer
to play host A’s stream.setMixTranscodingConfig
to start On-Cloud MixTranscoding, specifying audio-related parameters including audioSampleRate
, audioBitrate
, and audioChannels
.// Host AV2TXLiveDef.V2TXLiveTranscodingConfig config = new V2TXLiveDef.V2TXLiveTranscodingConfig();// Set the resolution to 720 × 1280 px, bitrate 1500 Kbps, and frame rate 20 fpsconfig.videoWidth = 720;config.videoHeight = 1280;config.videoBitrate = 1500;config.videoFramerate = 20;config.videoGOP = 2;config.audioSampleRate = 48000;config.audioBitrate = 64;config.audioChannels = 2;config.mixStreams = new ArrayList<>();// Position of the camera image of host AV2TXLiveDef.V2TXLiveMixStream local = new V2TXLiveDef.V2TXLiveMixStream();local.userId = "localUserId";local.streamId = null; // `streamID` is required for the remote user but not for the local userlocal.x = 0;local.y = 0;local.width = videoWidth;local.height = videoHeight;local.zOrder = 0; // When `zOrder` is set to `0`, it indicates that the host’s image is displayed at the bottomconfig.mixStreams.add(local);// Position of the camera image of host BV2TXLiveDef.V2TXLiveMixStream remoteB = new V2TXLiveDef.V2TXLiveMixStream();remoteB.userId = "remoteUserIdB";remoteB.streamId = "remoteStreamIdB"; // `streamID` is required for the remote user but not for the local userremoteB.x = 400; // For reference onlyremoteB.y = 800; // For reference onlyremoteB.width = 180; // For reference onlyremoteB.height = 240; // For reference onlyremoteB.zOrder = 1;config.mixStreams.add(remoteB);// Start On-Cloud MixTranscodingpusher.setMixTranscodingConfig(config);//Host BV2TXLiveDef.V2TXLiveTranscodingConfig config = new V2TXLiveDef.V2TXLiveTranscodingConfig();// Set the resolution to 720 × 1280 px, bitrate 1500 Kbps, and frame rate 20 fpsconfig.videoWidth = 720;config.videoHeight = 1280;config.videoBitrate = 1500;config.videoFramerate = 20;config.videoGOP = 2;config.audioSampleRate = 48000;config.audioBitrate = 64;config.audioChannels = 2;config.mixStreams = new ArrayList<>();// Position of the camera image of host BV2TXLiveDef.V2TXLiveMixStream local = new V2TXLiveDef.V2TXLiveMixStream();local.userId = "localUserId";local.streamId = null; // `streamID` is required for the remote user but not for the local userlocal.x = 0;local.y = 0;local.width = videoWidth;local.height = videoHeight;local.zOrder = 0; // When `zOrder` is set to `0`, it indicates that the host’s image is displayed at the bottomconfig.mixStreams.add(local);// Position of the camera image of host AV2TXLiveDef.V2TXLiveMixStream remoteA = new V2TXLiveDef.V2TXLiveMixStream();remoteA.userId = "remoteUserIdA";remoteA.streamId = "remoteStreamIdA"; // `streamID` is required for the remote user but not for the local userremoteA.x = 400; // For reference onlyremoteA.y = 800; // For reference onlyremoteA.width = 180; // For reference onlyremoteA.height = 240; // For reference onlyremoteA.zOrder = 1;config.mixStreams.add(remoteA);// Start On-Cloud MixTranscodingpusher.setMixTranscodingConfig(config);
// Host AV2TXLiveTranscodingConfig *config = [[V2TXLiveTranscodingConfig alloc] init];// Set the resolution to 720 × 1280 px, bitrate 1500 Kbps, and frame rate 20 fpsconfig.videoWidth = 720;config.videoHeight = 1280;config.videoBitrate = 1500;config.videoFramerate = 20;config.videoGOP = 2;config.audioSampleRate = 48000;config.audioBitrate = 64;config.audioChannels = 2;// Position of the camera image of host AV2TXLiveMixStream *local = [[V2TXLiveMixStream alloc] init];local.userId = @"localUserId";local.streamId = nil; // `streamID` is required for the remote user but not for the local userlocal.x = 0;local.y = 0;local.width = videoWidth;local.height = videoHeight;local.zOrder = 0; // When `zOrder` is set to `0`, it indicates that the host’s image is displayed at the bottom// Position of the camera image of host BV2TXLiveMixStream *remoteB = [[V2TXLiveMixStream alloc] init];remoteB.userId = @"remoteUserIdB";remoteB.streamId = @"remoteStreamIdB"; // `streamID` is required for the remote user but not for the local userremoteB.x = 400; // For reference onlyremoteB.y = 800; // For reference onlyremoteB.width = 180; // For reference onlyremoteB.height = 240; // For reference onlyremoteB.zOrder = 1;// Specify the streams to mixconfig.mixStreams = @[local,remoteB];// Start On-Cloud MixTranscodingpusher.setMixTranscodingConfig(config);//Host BV2TXLiveTranscodingConfig *config = [[V2TXLiveTranscodingConfig alloc] init];// Set the resolution to 720 × 1280 px, bitrate 1500 Kbps, and frame rate 20 fpsconfig.videoWidth = 720;config.videoHeight = 1280;config.videoBitrate = 1500;config.videoFramerate = 20;config.videoGOP = 2;config.audioSampleRate = 48000;config.audioBitrate = 64;config.audioChannels = 2;// Position of the camera image of host AV2TXLiveMixStream *local = [[V2TXLiveMixStream alloc] init];local.userId = @"localUserId";local.streamId = nil; // `streamID` is required for the remote user but not for the local userlocal.x = 0;local.y = 0;local.width = videoWidth;local.height = videoHeight;local.zOrder = 0; // When `zOrder` is set to `0`, it indicates that the host’s image is displayed at the bottom// Position of the camera image of host AV2TXLiveMixStream *remoteA = [[V2TXLiveMixStream alloc] init];remoteA.userId = @"remoteUserIdA";remoteA.streamId = @"remoteStreamIdA"; // `streamID` is required for the remote user but not for the local userremoteA.x = 400; // For reference onlyremoteA.y = 800; // For reference onlyremoteA.width = 180; // For reference onlyremoteA.height = 240; // For reference onlyremoteA.zOrder = 1;// Specify the streams to mixconfig.mixStreams = @[local,remoteA];// Start On-Cloud MixTranscodingpusher.setMixTranscodingConfig(config);
streamid
on the same device possible with TXLivePusher
and TXLivePlayer
but not with V2TXLivePusher
and V2TXLivePlayer
?V2TXLivePusher
and V2TXLivePlayer
are based on Tencent Cloud’s TRTC protocol. This is a UDP-based private protocol that features ultra-low latency and does not support using the same streamid
for ultra-low-latency publishing and playback on the same device. We have determined that it’s not necessary to support this given the current use cases, but may consider optimizing the protocol in the future.SDKAppID
identifies your application, and UserID
your user. UserSig
is a security signature calculated based on the two parameters using the HMAC SHA256 encryption algorithm. Attackers cannot use your Tencent Cloud traffic without authorization as long as they cannot forge a UserSig
. UserSig
calculation involves hashing crucial information such as SDKAppID
, UserID
, and ExpireTime
, as shown below.// UserSig formula, in which `secretkey` is the key used to calculate UserSigusersig = hmacsha256(secretkey, (userid + sdkappid + currtime + expire +base64(userid + sdkappid + currtime + expire)))
V2TXLivePusher
and V2TXLivePlayer
?-5
mean?-5
means failure to call an API due to invalid license. The enumerated value is V2TXLIVE_ERROR_INVALID_LICENSE. For other error codes, please see V2TXLiveCode.404
error occurs when I try to play streams via CDNs after successfully publishing streams over RTC?
Was this page helpful?