我有一个带有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 ?