繁体   English   中英

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

[英]How can I access the GOV header contents of a MPEG4 file?

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

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

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

补充数据通常直接嵌入到流中,并据推测被写入MP4文件的视频有效载荷数据中。 目的是保留符合MPEG-4的整个流,而内部还有其他数据。 解码器通常只会忽略它。

通常,您需要从文件中流回该数据并解析流以提取包含触发信息的数据部分。 您将需要用于视频流的特定API(文件格式/多路分解器等-毕竟您的操作系统和环境是什么?),并且您需要Axis技术信息以了解它们嵌入的内容以及解析的确切程度。

如果您通过RTSP流式传输,则不会传输MPEG4标头-而是通过来自客户端的DESCRIBE请求交换“ SDP”(会话描述协议)信息。 该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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM