C++ 如何访问MPEG4文件的GOV头内容?

C++ 如何访问MPEG4文件的GOV头内容?,c++,header,camera,rtsp,mpeg-4,C++,Header,Camera,Rtsp,Mpeg 4,我想知道如何访问mp4视频文件的GOV标题的内容 我使用Axis摄像机通过RTSP传输视频,RTSP以mp4格式存储在硬盘中。根据文档,摄像头在MPEG4 GOV报头中插入特定的触发数据,但我不知道如何访问或检索这些信息 我正在开发C++应用程序,但现在我不需要编程处理数据,所以允许GOV头内容可视化的解决方案对我来说足够了。< /P> < P>补充数据通常被嵌入到流中,并被认为写入MP4文件的视频有效载荷数据。其目的是保持整个流符合MPEG-4标准,其中仍包含附加数据。解码器通常会忽略它 您通

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

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


我正在开发C++应用程序,但现在我不需要编程处理数据,所以允许GOV头内容可视化的解决方案对我来说足够了。< /P> < P>补充数据通常被嵌入到流中,并被认为写入MP4文件的视频有效载荷数据。其目的是保持整个流符合MPEG-4标准,其中仍包含附加数据。解码器通常会忽略它


您通常需要将该数据流从文件中返回,并解析该流以提取包含触发器信息的数据部分。您需要视频流的特定API(文件格式/解复用器等-您的操作系统和环境到底是什么?),并且您需要Axis技术信息来查看它们到底嵌入了什么,以及您需要如何准确地解析这些信息。

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

如果您特别需要访问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;
}

private int-ifba(字节[]缓冲区,int偏移量){

ItReVALV=(缓冲区[Office)和0xFF ]我使用Visual C++ 2008 Express版在Windows 7下开发。文档中说,触发器数据块被包含在GOV头中的“用户数据”中,该格式可以包含几个格式的数据块。用户数据部分以00000 1B2(HEX)开头。触发数据从0a03(十六进制)开始。
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;
}