C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[13691] Re:[질문] AVI, DAT 등의 파일에서 정보 추출하기..
김준한 [] 1735 읽음    2001-12-15 21:35
전에 MPEG2 공부하며 만든 함수인데 참고하세요...

참고로 AVI는 MPEG4계열이라고 보시면 되고요...아래에 있는 함수는 MPEG1/2 에서 만
작동 합니다
--MPEG1-- video .m1p, .m1v, .mp1, .mpg, .mpeg, .mpv
--MPEG2-- video .m2p, .m2v, .mp2, .mpg, .mpeg, .mpv

//----------------------------------------------------------------------------------------------

#define READSIZE 10240

struct TIMECODE {
  unsigned      : 7;
  unsigned pic  : 6;
  unsigned sec  : 6;
  unsigned      : 1;
  unsigned min  : 6;
  unsigned hour : 5;
  unsigned      : 1;
};

int GetRunningTime(char *FileName, struct TIMECODE *tc)
{
FILE *fp;

   if ((fp = fopen(FileName, "rb")) != NULL) {

      char buffer[READSIZE];
      int read;

      fseek(fp, 0, SEEK_END); // 파일의 끝으로 이동

      do {
         fseek(fp, -READSIZE, SEEK_CUR);        // 읽을 Bytes 만큼 뒤로 이동
         read = fread(buffer, 1, READSIZE, fp); // 버퍼로 읽어옴

         for (int i = 0; i < read - 3; i++) { // 해더가 4바이트 이기 때문에 3을 빼고...

             if (*(int *)&buffer[i] == 0xB8010000) { // 시퀀셜 해더 를 찾아서...

                ((byte *)tc)[0] = (byte)buffer[i+7];
                ((byte *)tc)[1] = (byte)buffer[i+6];
                ((byte *)tc)[2] = (byte)buffer[i+5];
                ((byte *)tc)[3] = (byte)buffer[i+4];

                return(1);
             }
         }

         fseek(fp, -READSIZE + 3, SEEK_CUR);

      } while(ftell(fp) > READSIZE);

      fclose(fp);
   }

   return(0);
}


void main() // 함수 사용예
{
struct TIMECODE tc;

  if (GetRunningTime("C:\\movie.mpg", &tc)) {

     printf("Running Time is %d:%d:%d.%d", tc.hour, tc.min, tc.sec, tc.pic);
  }
}

//----------------------------------------------------------------------------------------------

참고로 MPEG1/2 파일에서는 일정 간격으로 (상당히 많은)해더가 포함되어있으며 여기에 타임코드라는
시간정보가 들어있습니다.
파일의 전체재생 시간을 구하려면 파일 가장 마지막에 있는 해더의 타임코드를 읽어오면 됩니다.
그런데 약간의 문제점도 있습니다. 일부 비표준 편집툴로 자른 MPEG파일은 타임코드가 00:00:00부터
시작하지 않을수도 있기 때문에 실제로 재생시 더 짧은 시간만 재상하고 끝날수가 있고...그래서
파일의 가장처음에 있는 해더를 읽어서 그 타임코드를 구하고 마지막 타임코드를 구해서 계산을
하시면 거의 정확한(2초정도 오차가 있기도 하더군요) 시간을 얻을수 있습니다.

화면 크기, 제생시간, 화면비율, 비트레이트등도 위와같은 방법으로 구하시면 되는데 그건 해더 정보를
참고 하세요...

도움이 되시길...


Falco 님이 쓰신 글 :
: avi, dat, mpeg 등의 동영상 파일에서 정보(초당 프레임수, 화면크기, 재생시간등)를 뽑아 올려고 합니다.
:
: TMediaPlayer 등을 이용할 경우는 해당 파일을 재생하는데 필요한 코덱이 없을경우에는 불가능하게 될것 같아서 VCL을 사용하지 않고 파일에서 직접 읽어 왔으면 하거든요.  물론 플레이는 현재로서는 필요치 않습니다.
:
: 그러면 파일구조를 먼저 알아야 겠는데, mmsystem.h 파일이나 The Programmer's File Format Collection(http://www.wotsit.org)에 가서 살펴 보았는데, 도저히 파악을 할 수가 없네요.
:
: 혹시 여기에 대한 자세한 자료 가지고 계신분 있으십니까?
:
: 혹은 이 방법에 도움이 될만한 방법을 알고 계신분 있으시면 도움을 주셨으면 좋겠습니다.
:
: 그럼. 답변을 기다리며..

+ -

관련 글 리스트
13557 [질문] AVI, DAT 등의 파일에서 정보 추출하기.. Falco 1657 2001/12/11
13691     Re:[질문] AVI, DAT 등의 파일에서 정보 추출하기.. 김준한 1735 2001/12/15
13579     자료실에 컴포넌트를 올려 두었습니다. 박정모 1074 2001/12/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.