0

我正在制作和应用程序将音频传输到接收服务器。我想对音频缓冲区进行编码以便进行流式传输。我做了一个类来存储这个缓冲区和其他一些信息。当我在对主对象编码后解码数据时,这两个对象有不同的音频缓冲区。

所以结论是我在编码/解码方面犯了一个错误。这是我编码缓冲区的代码

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeBytes:&_data length:sizeof(float *)];
    [aCoder encodeInt:_numFrames forKey:numFrames];
    [aCoder encodeInt:_numChannels forKey:numChannels];
}

NOTE _data具有(float *)c 数据类型

解码逻辑在这里

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {

        NSUInteger length = 0;
        {
            const uint8_t *buffer = [aDecoder decodeBytesForKey:data returnedLength:&length];
            assert(length);
            memcpy(&_data, buffer, length);
        }
        _numFrames = [aDecoder decodeInt32ForKey:numFrames];
        _numChannels = [aDecoder decodeInt32ForKey:numChannels];
    }
    return self;
}

我正在使用这种方法来比较它们是否相同

- (BOOL)isEqual:(id)object {
    AudioPacket *compareObject = (AudioPacket *)object;
    return (_data == compareObject.data && _numFrames == compareObject.numFrames && _numChannels == compareObject.numChannels);
}
4

1 回答 1

1

不确定,但是当您编码时,_data您不会给它一个密钥:

[aCoder encodeBytes:&_data length:sizeof(float *)];

解码_data时使用密钥data

 const uint8_t *buffer = [aDecoder decodeBytesForKey:data returnedLength:&length];

也许你想要一个encodeBytes同样需要密钥的版本

 encodeBytes:length:forKey:
于 2013-10-02T02:19:54.863 回答