如果您通过 RTSP 进行流式传输,则不会传输 MPEG4 标头 - 而是通过来自客户端的 DESCRIBE 请求交换“SDP”(会话描述协议)信息。此 sdp 文件包含帧速率等的编码版本,该版本实际上取自 mpeg4 标头中的 MDAT atom。
如果您特别需要访问 gov atom 以确定 p-frame i-frame 差异,您可以尝试在服务器上解析 MPEG4 标头并通过单独的通道传输它。
MPEG4 标头的外观基本上是一个纯文本原子名称,然后是一个通常为 4 个字节的长度(您需要根据您的平台进行字节交换),然后是数据。
这是我在 mpeg4 标头解析器中的一些调试代码:
public boolean valid_atom(byte[] word, int offset) {
for (int i = 0; i < 4; i++)
if (!(word[i + offset] >= 'a' && word[i + offset] <= 'z') && !(word[i + offset] >= 'A' && word[i + offset] <= 'Z'))
return false;
return true;
}
...
public int parse_atom(byte[] b, int offset, int depth) {
int len;
len = ifba(b, offset);
Log.d(TAG, String.format("atom: %c%c%c%c depth %d @ %d len %d", b[offset + 4], b[offset + 5], b[offset + 6], b[offset + 7], depth, offset, len));
return len;
}
...
private int ifba(byte[] buffer, int offset) {
int retval = (buffer[offset] & 0xFF) << 24;
retval += (buffer[offset + 1] & 0xFF) << 16;
retval += (buffer[offset + 2] & 0XFF) << 8;
retval += (buffer[offset + 3] & 0XFF);
return retval;
}