我有一个带有 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.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 的“序列参数集 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?