尝试在Android 4.2(Nexus 7)上播放AVC High Profile视频时崩溃

时间:2013-05-21 11:00:06

标签: android android-mediaplayer

我有一个带有AVC High Profile视频的TS,它在Android 4.2上根本不播放 短流样本位于:vid-avc-hp_aud-mp3.ts

可在此类设备上使用MediaPlayer播放“vid-avc-hp_aud-mp3.ts”流:
1.华硕Transformer TF201(搭载Android 4.1.1)
2. Acer Iconia Tab A510(使用Android 4.1.2)

当我尝试使用MediaPlayer在Nexus 7(使用Android 4.2.2)上播放流时,它根本不播放。这里只有logcat崩溃:

05-08 14:25:31.275: A/avc_utils(15626): frameworks/av/media/libstagefright/avc_utils.cpp:63 CHECK_EQ( br.getBits(1),0u) failed: 1 vs. 0
05-08 14:25:31.275: A/libc(15626): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 15666 (TimedEventQueue)

Nexus 7的完整logcat位于:logcat_crash

崩溃来自media/libstagefright/avc_utils.cpp,来自Android资源的以下功能:

// Determine video dimensions from the sequence parameterset.
void FindAVCDimensions(
        const sp<ABuffer> &seqParamSet, int32_t *width, int32_t *height) {
    ABitReader br(seqParamSet->data() + 1, seqParamSet->size() - 1);

    unsigned profile_idc = br.getBits(8);
    br.skipBits(16);
    parseUE(&br);  // seq_parameter_set_id

    unsigned chroma_format_idc = 1;  // 4:2:0 chroma format

    if (profile_idc == 100 || profile_idc == 110
            || profile_idc == 122 || profile_idc == 244
            || profile_idc == 44 || profile_idc == 83 || profile_idc == 86) {
        chroma_format_idc = parseUE(&br);
        if (chroma_format_idc == 3) {
            br.skipBits(1);  // residual_colour_transform_flag
        }
        parseUE(&br);  // bit_depth_luma_minus8
        parseUE(&br);  // bit_depth_chroma_minus8
        br.skipBits(1);  // qpprime_y_zero_transform_bypass_flag
        CHECK_EQ(br.getBits(1), 0u);  // seq_scaling_matrix_present_flag   //<<-- the crash is here
    }
    (...)

我检查过问题通常是自Android 4.2

以来播放任何AVC HighProfile传输流

对流“vid-avc-hp_aud-mp3.ts”的深入分析表明问题在于AVC High Profile的“Sequence parameter set RBSP”的解析器。 High Profile的“Sequence parameter set RBSP”包含一些附加字段。问题在于“seq_scaling_matrix_present_flag”和以下缩放矩阵结构。如果“seq_scaling_matrix_present_flag”设置为1 - 下一个字节包含缩放系数。

我有以下问题:
1.如何在Android上使用AVC High Profile视频播放TS流?    注意:由于流服务器性能限制,无法将流转码为任何较低的配置文件。
2.为什么Android无法解析这个结构,根据规范这是正确的: ISO / IEC 14496-10

0 个答案:

没有答案