«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

VIDEOCUBE

[ Cube Project ] 개발 일지 ( TS 분석 ) 본문

프로젝트

[ Cube Project ] 개발 일지 ( TS 분석 )

라떼청년 2018. 11. 23. 01:43

ffmpeg 을 이용하여
해당 파일을 ts 화 하였습니다.

ffmpeg -y -i ../BigBuckBunny.mp4 -f segment -c:v copy -c:a copy -segment_format mpegts -segment_list_flags -cache -segment_time 10 -segment_start_number 1 -segment_list BigBuckBunny.m3u8  BigBuckBunny-%d.ts

test 폴더에 넣고 각 ts 를 분석하는 과정입니다.

1. TS 파일 내에 188바이트씩 나열이 되어 있으며, 최초로 시작되는 1 바이트는 47로 고정되어 있습니다.

2. TS Header 분석
  [ Video ]
   47 40 11 10     :   0100 0000   ( 40 ) ,  0001 0001 ( 11 )  , 0001 0000 ( 10 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 11번 ( 0 0000 0001 0001 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 0 ( 0000 )  ( 같은 PID + 1 증가 )

   47 40 00 10     :   0100 0000   ( 40 ) ,  0000 0000 ( 0 )  , 0001 0000 ( 10 )

      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 0번 ( 0 0000 0000 0000 )  ( PAT ) Program Association Table
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 0 ( 0000 )  ( 같은 PID + 1 증가 )

  47 50 00 10     :   0101 0000   ( 50 ) ,  0000 0000 ( 0 )  , 0001 0000 ( 10 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 1000번 ( 1 0000 0000 0000 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 0 ( 0000 )  ( 같은 PID + 1 증가 )

47 41 00 30     :   0100 0001   ( 41 ) ,  0000 0000 ( 0 )  , 0011 0000 ( 30 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 100번 ( 0 0001 0000 0000 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 다음에, 페이로드 있음 ( 11 )
      ㄴ 연속카운터 0 ( 0000 )  ( 같은 PID + 1 증가 )

47 01 00 11     :   0000 0001   ( 01 ) ,  0000 0000 ( 0 )  , 0001 0001 ( 11 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 중간 부분에 포함 ( 0 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 100번 ( 0 0001 0000 0000 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 1 ( 0001 )  ( 같은 PID + 1 증가 )

...... 생략

47 01 00 36     :   0000 0001   ( 01 ) ,  0000 0000 ( 0 )  , 0011 0110 ( 36 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 중간 부분에 포함 ( 0 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 100번 ( 0 0001 0000 0000 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 다음에, 페이로드 있음 ( 11 )
      ㄴ 연속카운터 6 ( 0110 )  ( 같은 PID + 1 증가 ) 15가 넘으면 0으로 초기화


...... 생략

[ Audio ]
47 41 01 30     :   0100 0001   ( 41 ) ,  0000 0001 ( 1 )  , 0011 0000 ( 30 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) , 
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 101번 ( 0 0001 0000 0001 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 다음에, 페이로드 있음 ( 11 )
      ㄴ 연속카운터 0 ( 0000 )  ( 같은 PID + 1 증가 ) 15가 넘으면 0으로 초기화

47 01 01 11     :   0000 0001   ( 01 ) ,  0000 0001 ( 1 )  , 0001 0001 ( 11 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 0 ) , 
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 101번 ( 0 0001 0000 0001 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 1 ( 0001 )  ( 같은 PID + 1 증가 ) 15가 넘으면 0으로 초기화
...... 생략

47 40 00 11     :   0100 0000   ( 40 ) ,  0000 0000 ( 0 )  , 0001 0001 ( 11 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) , 
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 0번 ( 0 0000 0000 0000 )  ( PAT ) Program Association Table
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 1 ( 0001 )  ( 같은 PID + 1 증가 ) 15가 넘으면 0으로 초기화

47 50 00 11     :   0101 0000   ( 50 ) ,  0000 0000 ( 0 )  , 0001 0001 ( 11 )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 처음 부분에 포함 ( 1 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 1000번 ( 1 0000 0000 0000 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 없음, 페이로드만 있음 ( 01 )
      ㄴ 연속카운터 1 ( 0001 )  ( 같은 PID + 1 증가 )
...... 생략

47 01 01 3E     :   0000 0001   ( 01 ) ,  0000 0001 ( 1 )  , 0011 1110 ( 3E )
      ㄴ 정상 ( 0 )
      ㄴ packet 에 Original Data 중간 부분에 포함 ( 0 ) ,
      ㄴ 같은 PID 가 존재할 경우 후순위 ( 0 )
      ㄴ PID 101번 ( 0 0001 0000 0001 )
      ㄴ not scrambled ( 00 )
      ㄴ 유효필드 다음에, 페이로드 있음 ( 11 )
      ㄴ 연속카운터 14 ( 1110 )  ( 같은 PID + 1 증가 ) 15가 넘으면 0으로


[ Adaptation Field 분석 ]

adaptaion_field_length ( 8 Bits )

ㄴ 길이
-------------------------------------------------- ( 8 Bits )

ㄴ discontinuity_indicator ( 1Bits )

ㄴ random_access_indicator ( 1Bits )

ㄴ elementary_system_priority_indicator ( 1 Bits )

ㄴ (PF) PCR_flag (1 Bits) PF = 1 적응필드 내 PCR 필드를 포함

ㄴ (OF) OPCR flage (1 Bits)

ㄴ (SPF) (1 Bits)

ㄴ (TPDF) transport_private_data_flag ( 1 Bits )

ㄴ (AFEF) adaptation_field_extension_flag ( 1 Bits )


- PCR ( Program Clock Reference ) , OPCR 필드 ( 48 Bits ) --- [ 6Byte ]

- stuffing_bytes 채워넣기 ( n X 8 bit ) : 0xFF

47 01 00 31 ( 184byte 이하 ) > 유효성 필드 앞에 위치
58 00
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF
1 Byte + ( 87 Byte )

47 41 00 30 [ Video 1번째 샘플 ]
07 50 ( random_access_indicator, (PF) PCR_flag (1 Bits) PF = 1 적응필드 내 PCR 필드를 포함 )
00 00 7B 0C 7E 00 ( Adaption Field )

PCR
0000 0000 0000 0000 0111 1011 0000 1100 0 111 111 0 0000 0000
0000 0000 0000 0000 0111 1011 0000 1100 0 ( Base )
111 111 ( Reservation )
0 0000 0000 ( extension )

필드값 계산 : base * 300 + extension = 63,000 * 300 + 0 = 18900000
base : 시스템 클럭 주파수 27 MHz 를 300 으로 나눈 90KHz 시간해상도로 시각을 33비트로 표현
extension : 시스템 클럭 주파수 27MHz 시간해상도로 시각을 9비트로 표현

47 41 00 3B  [ Video 3번째 샘플 ]
90 10
00 00 89 B2 7E 00
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF

참고) http://www.ktword.co.kr/abbr_view.php?m_temp1=5588

[ PES 분석 ] Packetized elementary stream

00 00 01 E0 00 00 ( PES 헤더 )

packet_start_code_prefix
packet_start_code_prefix ( 24 Bits )
00 00 01

stream_id ( 8bits )
E0  | Audio : C0 ~ DF | Video : E0 ~ EF

PES_packet_length ( 16 bits )
00 00 ( 0 )

이 필드 다음에 패킷에 남아있는 바이트 수를 지정합니다.
0 일 수 있습니다.
PES 패킷 길이가 0으로 설정되면, PES 패킷은 임의의 길이 일 수있다.
PES 패킷 길이가 0 인 값은 PES 패킷 페이로드가 비디오 기본 스트림 일 때만 사용될 수 있습니다.
- optional PES Header -
ㄴ PES
_scrambling_control ( 2 bit )
ㄴ PES_priority ( 1 bit )

- 타이밍 시간 정보 : ESCR ( Elementary Stream Clock Reference ), PTS, DTS
- 우선순위 플래그 : 중요도 표기
- 암호화 제어 플래그
- 트릭모드 재생정보 : 재생속도
- 저작권 등

47 41 01 30 [ Sound 1~4번째 샘플 ]
00 00 01
C0
0A B9 ( ? )

참고) http://www.ktword.co.kr/abbr_view.php?m_temp1=5262


Program Association Table 구조분석


47 40 00 10 [ PAT ] Program Association Table

00 00 B0 0D 00 01 C1 00 00 00 01 F0 00 2A B1 04 B2


PMT 의 PID 및 TS 다중화된 모든 프로그램에 대한 일괄적인 목록 정보 포함

00 0000 0000     ( 하나의 세션이 시작할 경우 0x00 )

00 0000 0000    1. table_id ( 8bit ) 0x00    

B0 1                2. section_syntax_indicator : ( 1Bit ) 

    0                3. 0                                 ( 1Bit )

    11              4. Reserved                       ( 2Bit ) 

    0000           

0D 0000 1101   5. section_length : 최대값 1021 ( 2MSB = 0 ) (12Bits) 

00 0000 0000      

01 0000 0001   6. transport_stream_id : 네트워크 내 TS 식별 ( 16Bits )

C1 11             7. Reserved                      ( 2Bit )

    00 000        8. version_number : PAT 버전, PAT 변경 때 마다 1씩 증가 ( 5Bits )

    1               9. current_next_indicator : 1, 현재 0, 다음테이블에서 확인 ( 1Bit ) 

00 0000 0000   10. section_number : 현재 섹션 번호 ( 8 Bits )

00 0000 0000   11. last_section_number : 마지막 섹션 번호 ( 8 Bits )

------------------------------------------------------------------------------------------------      

00 0000 0000       

01 0000 0001   12. program_number :  ( 16 Bits )                 

F0 111            13. Reserved              ( 3 Bits )

    1 0000       

00 0000 0000    14. (program_number == 0) network_PID  |  program_map_PID  ( 13Bits )  ( 1000000000000 = HEX ( 1000 )

------------------------------------------------------------------------------------------------- 

2A 0010 1010

B1 1011 0001  

04 0000 0100  

B2 1011 0010  15. CRC_32 ( 32 Bits )


참고) http://magazine.hellot.net/magz/article/articleDetail.do?flag=all&showType=showType1&articleId=ARTI_000000000035496&articleAllListSortType=sort_1&page=1&selectYearMonth=200908&subCtgId=

테이블 

 PID

 Table ID

 내용

 PAT

 0x0000

 0x00

 Program Association Table

 CAT

 0x0001

 0x01

 Conditional Access Table

 PMT

 PAT 정의

 0x02

 Program Map Table

 NIT

 0x0010

 0x40

0x41

 Network Information Table

 SDT

 0x0011

0x42

0x46

 Service Description Table

 BIT

 0x0024

 0xC4

 Broadcaster Information Table

 TOT

 0x0014

 0x73

 Time Offset Table

 EIT

 0x0012

0x0027

 0x4E ~ 6F

 Event Information Table

 Null

 0x1FFF

 -

 레이트 조정용 무효패킷


47 40 11 10 [ PID 11 SDT ]

00 42 F0 25 00 01 C1 00 00 FF 01 FF 00 01 FC 80 14 48 12 01 06 46 46 6D 70 65 67 09 53 65 72 76 69 63 65 30 31 

77 7C 43 CA 

==> Service Description Table


47 50 00 10 [ PID 1000 PMT ]

00 02 B0 1D 00 01 C1 00 00 E1 00 F0 00 1B E1 00 F0 00 0F E1 01 F0 06 0A 04 65 6E 67 00 8D 82 9A 07 

==> Program Map Table


반응형
Comments