如何访问MPEG4文件的GOV标题内容?

时间:2012-12-21 08:27:51

标签: c++ header camera rtsp mpeg-4

我想知道如何访问mp4视频文件的GOV标题的内容。

我正在使用Axis相机通过RTSP流式传输视频,RTSP以mp4格式存储在硬盘中。根据文档,相机在MPEG4 GOV标题中插入特定的触发数据,但我不知道如何访问或检索这些信息。

我正在开发一个C ++应用程序,但是现在我不需要以编程方式处理数据,因此允许可视化GOV标题内容的解决方案对我来说已经足够了。

2 个答案:

答案 0 :(得分:0)

补充数据通常直接嵌入到流中,并且据称被写入MP4文件的视频有效载荷数据中。目的是保持整个流MPEG-4兼容,内部还有额外的数据。解码器通常会忽略它。

您通常需要从文件中流回该数据并解析流以使用触发器信息提取数据部分。您需要用于视频流的特定API(文件格式/解复用器等 - 毕竟您的操作系统和环境是什么?)并且您需要Axis技术信息才能看到它们是什么嵌入以及您需要解析它的确切方式。< / p>

答案 1 :(得分:0)

如果您通过RTSP进行流式传输,则不会传输MPEG4标头 - 而是#34; SDP&#34; (会话描述协议)信息通过来自客户端的DESCRIBE请求进行交换。此sdp文件包含帧速率等的编码版本,实际上是从mpeg4标头中的MDAT原子获取的。

如果您特别需要访问gov原子以确定p帧i帧差分,您可以尝试解析服务器上的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;
}