我正在尝试使用 Android 的 MediaPlayer 类来播放 RTSP 流。MediaPlayer 调用一个名为 stagefright 的本地库来实现这一点。该库和整个媒体框架因以下错误而崩溃:
15988-23172/? A/APacketSource﹕ frameworks/av/media/libstagefright/rtsp/APacketSource.cpp:143 CHECK_EQ( (unsigned)nalType,7u) failed: 22 vs. 7
所以似乎很明显错误是什么 - 断言在nalType
应该是 7 时失败,但结果却是 22。我不明白为什么会这样。对于上下文,RTSP 流的 SDP 包含一个属性sprop-parameter-sets
,它是一组 base64 编码的字节。nalType
似乎是指 base64-decoding 结果的第一个字节sprop-parameter-sets
。在本例中,这是 base64 编码的版本:
NjdkMDAxNmRhMDI4MGY2YzA1NTIwMDAwMDAzMDA0MDAwMDAwNzhjMDgwMDNlODAwMDBhOGMzN2JkZjBiYzIy
解码后,应该是这样的:
67d0016da0280f6c0552000000300400000078c08003e80000a8c37bdf0bc22
以下是来自 Android 4.4 源代码的相关摘录APacketSource.cpp
:
// Appears to assign value of "sprop-parameter-sets" from SDP to 'val'
if (!GetAttribute(params, "sprop-parameter-sets", &val)) {
return NULL;
}
size_t start = 0;
for (;;) {
ssize_t commaPos = val.find(",", start);
size_t end = (commaPos < 0) ? val.size() : commaPos;
AString nalString(val, start, end - start);
sp<ABuffer> nal = decodeBase64(nalString);
CHECK(nal != NULL);
CHECK_GT(nal->size(), 0u);
CHECK_LE(nal->size(), 65535u);
// Mask away everything but 0001 1111 from the first byte
uint8_t nalType = nal->data()[0] & 0x1f;
if (numSeqParameterSets == 0) {
// Line 143, where the failure happens.
CHECK_EQ((unsigned)nalType, 7u);
}
...
}
第一个字节 0x67 在被屏蔽后应该计算为 0x07。不知何故,它的值是 0x16。我不知道为什么会这样,尽管我怀疑nal->data()
.
我可以提供打印到日志的堆栈跟踪,但它非常大,我不确定它是否相关。为什么这个断言失败了?