VIDEOCUBE
[ Cube Project ] 개발 일지 ( TS 분석 ) 본문
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 )
테이블 |
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
'프로젝트' 카테고리의 다른 글
[ Cube Project ] 개발 일지 ( TS 만들기 ) (0) | 2018.11.24 |
---|---|
[ Cube Project ] 개발 일지 ( 샘플링하기 ) (0) | 2018.11.18 |
[ Cube Project ] 개발 일지 ( 샘플링하기 ) (0) | 2018.11.16 |
[ Cube Project ] Python MP4 Streaming Server (0) | 2017.12.05 |
[Cube Project] Nginx + Python CGI 연동 준비 (0) | 2017.12.04 |