2

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

流“vid-avc-hp_aud-mp3.ts”可以MediaPlayer在以下设备上播放:
1. Asus Transformer TF201(Android 4.1.1)
2. Acer Iconia Tab A510(Android 4.1.2)

当我尝试在 Nexus 7(使用 Android 4.2.2)上播放流时,MediaPlayer它根本无法播放。这里只有 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.cppAndroid源的以下功能:

// 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 的“序列参数集 RBSP”的解析器上。High Profile 的“序列参数集 RBSP”包含一些附加字段。问题在于“seq_scaling_matrix_present_flag”和以下缩放矩阵结构。如果“seq_scaling_matrix_present_flag”设置为 1 - 下一个字节包含缩放系数。

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

4

0 回答 0