0

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 でエンコードされた一連のバイトである属性が含まれています。nalTypebase64-decoding の結果の最初のバイトを参照しているようsprop-parameter-setsです。この場合、これは base64 でエンコードされたバージョンです。

NjdkMDAxNmRhMDI4MGY2YzA1NTIwMDAwMDAzMDA0MDAwMDAwNzhjMDgwMDNlODAwMDBhOGMzN2JkZjBiYzIy

デコードすると、次のようになります。

67d0016da0280f6c0552000000300400000078c08003e80000a8c37bdf0bc22

APacketSource.cpp以下は、Android 4.4 ソース コードからの関連する抜粋です。

// 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().

ログに出力されるスタックトレースを提供できますが、それは非常に大きく、関連性があるかどうかわかりません。このアサートが失敗するのはなぜですか?

4

0 に答える 0