2012-12-21 3 views
0

나는 mp4 비디오 파일의 GOV 헤더 내용에 액세스하는 방법을 알고 싶습니다.어떻게하면 MPEG4 파일의 GOV 헤더 내용에 액세스 할 수 있습니까?

하드 디스크에 mp4 형식으로 저장되어있는 RTSP를 통해 비디오를 스트리밍하려면 Axis 카메라를 사용하고 있습니다. 설명서에 따르면 카메라가 특정 트리거 데이터를 MPEG4 GOV 헤더에 삽입하지만이 정보를 액세스하거나 검색하는 방법을 알지 못합니다.

C++ 응용 프로그램을 개발 중이지만 프로그래밍 방식으로 데이터를 처리 할 필요가 없으므로 GOV 헤더 내용을 시각화 할 수있는 솔루션으로 충분할 것입니다.

답변

0

일반적으로 보충 데이터는 스트림에 직접 삽입되며 MP4 파일의 비디오 페이로드 데이터에 기록됩니다. 의도는 전체 스트림 MPEG-4 규격을 유지하면서도 내부에 추가 데이터를 보유하는 것입니다. 디코더는 일반적으로이를 무시합니다.

일반적으로 파일에서 해당 데이터를 다시 스트리밍하고 스트림을 구문 분석하여 트리거 정보가 포함 된 데이터 부분을 추출해야합니다. 비디오 스트리밍을위한 특정 API (파일 형식/디멀티플렉서 등 - 운영체제와 환경은 무엇입니까?)가 필요하며 Axis 기술 정보를 통해 정확히 무엇이 포함되고 있는지 정확하게 파싱해야합니다.

+0

나는 사용하여 Windows 7에서 개발하고 다음은

내 MPEG4 헤더 파서 내가 가진 몇 가지 디버깅 코드 Visual C++ 2008 Express Edition. 설명서에 따르면 트리거 데이터 블록은 GOV 헤더에 "사용자 데이터"로 포함되어 있습니다.이 데이터 블록은이 형식으로 서로 이어지는 여러 데이터 블록을 포함 할 수 있습니다. 사용자 데이터 섹션은 000001b2 (hex)로 시작하고 트리거 데이터는 0a03 (hex)으로 시작합니다. –

0

RTSP를 통해 스트리밍하는 경우 MPEG4 헤더가 전송되지 않습니다. 대신 "SDP"(세션 설명 프로토콜) 정보가 클라이언트의 DESCRIBE 요청을 통해 교환됩니다. 이 sdp 파일에는 실제로 mpeg4 헤더의 MDAT 아톰에서 가져온 프레임 속도 등의 인코딩 된 버전이 들어 있습니다.

p 프레임 i 프레임 차이를 결정하기 위해 특별히 gov 원자에 액세스해야하는 경우 서버에서 MPEG4 헤더를 파싱하고 별도의 채널을 통해 전송할 수 있습니다.

MPEG4 헤더가 보이는 방식은 기본적으로 일반 텍스트 아톰 이름이며, 보통 4 바이트 (플랫폼에 따라 바이트 스왑이 필요함)의 길이와 데이터입니다.

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; 
}