@interface SubtitleMsgData : NSObject
@property (nonatomic, assign) BOOL definite;
@property (nonatomic, copy) NSString *language;
@property (nonatomic, assign) BOOL paragraph;
@property (nonatomic, assign) NSInteger sequence;
@property (nonatomic, copy) NSString *text;
@property (nonatomic, copy) NSString *userId;
@property (nonatomic, assign) NSInteger roundId;
@property (nonatomic, assign) NSInteger firstCharPos;
@property (nonatomic, assign) NSInteger lastCharPos;
@implementation SubtitleMsgData
- (void)rtcRoom:( ByteRTCRoom *_Nonnull)rtcRoom onRoomBinaryMessageReceived:(NSString *_Nonnull)uid message:(NSData *_Nonnull)message {
NSString *subtitles = unpack(message);
uint32_t swapUInt32(uint32_t value) {
return ((value & 0x000000FF) << 24) |
((value & 0x0000FF00) << 8) |
((value & 0x00FF0000) >> 8) |
((value & 0xFF000000) >> 24);
NSString *unpack(NSData *data) {
const int kSubtitleHeaderSize = 8;
NSUInteger size = data.length;
if (size < kSubtitleHeaderSize) {
const uint8_t *message = data.bytes;
// Check magic number "subv"
uint32_t magic = (message[0] << 24) | (message[1] << 16) | (message[2] << 8) | message[3];
if (magic != 0x73756276) {
uint32_t length = (message[4] << 24) | (message[5] << 16) | (message[6] << 8) | message[7];
if (size - kSubtitleHeaderSize != length) {
NSString *subtitles = nil;
subtitles = [[NSString alloc] initWithBytes:message + kSubtitleHeaderSize length:length encoding:NSUTF8StringEncoding];
void parseData(NSString *msg) {
NSDictionary *json_data = [NSJSONSerialization JSONObjectWithData:[msg dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
NSLog(@"JSON Parse Error: %@", error);
NSMutableArray<SubtitleMsgData *> *subtitles = [NSMutableArray array];
for (NSDictionary *item in json_data[@"data"]) {
SubtitleMsgData *subData = [[SubtitleMsgData alloc] init];
subData.definite = [item[@"definite"] boolValue];
subData.language = item[@"language"];
subData.paragraph = [item[@"paragraph"] boolValue];
subData.sequence = [item[@"sequence"] integerValue];
subData.text = item[@"text"];
subData.userId = item[@"userId"];
subData.roundId = [item[@"roundId"] integerValue];
subData.firstCharPos = [item[@"firstCharPos"] integerValue];
subData.lastCharPos = [item[@"lastCharPos"] integerValue];
[subtitles addObject:subData];