분석

[MP4] 파일 미디어 샘플과 시간 정보를 구하는 방법

라떼청년 2017. 11. 29. 01:41


MP4 파일 미디어 샘플과 시간 정보를 구하는 방법


미디어 샘플의 정보는 샘플 테이블 박스에서 얻을 수 있다.

샘플 테이블 박스는 Sample Table Atom : stbl 이다.

stbl 을 찾아보자..


moov 내 Type 정보

moov > track > mdia > stbl 정보를 찾아보자


ftyp : 20

moov : 17708

moov > mvhd : 108

----------------- [ mvhd ] ----------------- 

Version 0

Flags 000000

CreateTime 2036-01-02 00:00:00

Durtaion 65536

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

moov > trak : 5870

----------------- [ trak ] ----------------- 

Type [tkhd]:[92]

Type [mdia]:[5770]

----------------- [ mdia ] ----------------- 

Type [mdhd]:[32]

Type [hdlr]:[45]

Type [minf]:[5685]

----------------- [ minf ] ----------------- 

Type [vmhd]:[20]

Type [dinf]:[36]

Type [stbl]:[5621]

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

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

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

moov > trak : 3968

----------------- [ trak ] ----------------- 

Type [tkhd]:[92]

Type [mdia]:[3868]

----------------- [ mdia ] ----------------- 

Type [mdhd]:[32]

Type [hdlr]:[45]

Type [minf]:[3783]

----------------- [ minf ] ----------------- 

Type [smhd]:[16]

Type [dinf]:[36]

Type [stbl]:[3723]

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

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

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

moov > trak : 6350

----------------- [ trak ] ----------------- 

Type [tkhd]:[92]

Type [tref]:[20]

Type [mdia]:[5966]

----------------- [ mdia ] ----------------- 

Type [mdhd]:[32]

Type [hdlr]:[54]

Type [minf]:[5872]

----------------- [ minf ] ----------------- 

Type [hmhd]:[28]

Type [dinf]:[36]

Type [stbl]:[5800]

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

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

Type [udta]:[264]

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

moov > trak : 1167

----------------- [ trak ] ----------------- 

Type [tkhd]:[92]

Type [tref]:[20]

Type [mdia]:[942]

----------------- [ mdia ] ----------------- 

Type [mdhd]:[32]

Type [hdlr]:[54]

Type [minf]:[848]

----------------- [ minf ] ----------------- 

Type [hmhd]:[28]

Type [dinf]:[36]

Type [stbl]:[776]

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

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

Type [udta]:[105]

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

moov > udta : 237

mdat : 2771337

free : 8

free : 76


stbl 안에는 

ㄴ co64 : 64bits Chunk Offset Box

ㄴ ctts : Composition Offset Box

ㄴ stco : Chunk Offset Box

ㄴ stsd : Sample Description

ㄴ stsc : Sample To Chunk Box

stss : Sync Sample [ 샘플의 시간 값 ] > 재생 시간 | timescale

ㄴ stsz : Sample Size Box

ㄴ stts : Time To Sample Box

위 정보가 있는 지 확인해 보자


어느것이 음성이고 어느것이 영상인지는 우선 나중에 찾고 

아래와 같이 트랙 내의 샘플은 다음과 같이 개수를 가지고 있었다

DTS (Decoding time Stamp) 와 PTS (Presentation Tome Stamp)를 구할 수 있다.

 ㄴ DTS 는 디코딩 되어야 하는 시점

 ㄴ PTS 는 디코딩 후 재생되어야 하는 시점


[ stts 정보 ]

Entry Count [335]

        샘플 개수 [개]                 재생시간

sample-count : [1] | sample-delta : [1272]

sample-count : [2] | sample-delta : [1303]  ==> 샘플 2개를 합쳐서 1초

sample-count : [1] | sample-delta : [1272]

sample-count : [2] | sample-delta : [1303]

sample-count : [1] | sample-delta : [1272]

sample-count : [2] | sample-delta : [1303]

sample-count : [1] | sample-delta : [1272]

sample-count : [2] | sample-delta : [1303]

sample-count : [1] | sample-delta : [1273]

.... 계속

Sample Count [5]

Sample Count [374]

Sample Count [37]


B 프레임이 존재하는 경우 샘플의 시간 순서가 순차적이 않다. 이럴 경우 다음 ctts 박스를 포함 하여 PTS를 구해야 와야 한다.

위 현재 파싱하고 있는 영상은 ctts 찾을 수 없었다.


Media Chunk와 Sample

[ stsc 정보 ]

Entry Count [41]

첫번째 청크        | 청크당 샘플 개수              | 샘플을 기술한 식별자

first-chunk : [1]|sample-per-chunk : [13]|sample-description-index : [1]  ==> 청크 1번에 13개의 샘플이 존재

first-chunk : [2]|sample-per-chunk : [11]|sample-description-index : [1]

first-chunk : [3]|sample-per-chunk : [12]|sample-description-index : [1]

first-chunk : [4]|sample-per-chunk : [11]|sample-description-index : [1]

first-chunk : [5]|sample-per-chunk : [12]|sample-description-index : [1]

first-chunk : [6]|sample-per-chunk : [11]|sample-description-index : [1]

first-chunk : [7]|sample-per-chunk : [12]|sample-description-index : [1]

.... 계속


이 영상은 1,2,3 ...... 로 되어 있지만 

1,3,5 ... 이렇게 첫번째 chunk 가 나올 수도 있는데

그럴 경우는 2개의 청크에 샘플 13개 이렇게 정보가 나올 수 있다

기술 식별자 [ sample-description-index ] 1은 ==> stsd 박스와 연결이 되어 있다


Sample의 사이즈를 다음 박스 정보를 참조하여 얻어낸다.

[ stsz 정보 ]

Sample count [480]

Entry-size [1552]

Entry-size [400]

Entry-size [945]

Entry-size [1494]

Entry-size [2527]

Entry-size [3693]

Entry-size [4216]

Entry-size [5136]

Entry-size [6479]

Entry-size [7198]

Entry-size [8029]

Entry-size [8872]

Entry-size [9822]

------------------------ 첫번째 Chunk 13 개

.... 계속

이는 Sample의 Size 이다


청크의 위치

stco, co64 박스 정보 참조 [ 파일 크기가 4GB 초과 시 co64 사용 ]

청크의 OFFSET 테이블

[ stco 정보 ]

Entry Count [42]

청크                 [ offset ]

chunk-offset [17736] ==> 17736 ~ [ 60 ] [ 32 ] .... ( 13 개 )

chunk-offset [84662]

chunk-offset [196261]

chunk-offset [270218]

chunk-offset [332059]

chunk-offset [383416]

chunk-offset [449724]

chunk-offset [559602]

chunk-offset [690399]

chunk-offset [803942]

.... 계속

이는 파일의 OFFSET이다


첫 번째 Sample 두 번째 Sample 실제 OFFSET 위치에서만큼 실제로 읽어보도록 한다.

00 00 01 B3 00 10 07 00 00 01 B6 10 00 18 14 60 5F DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C8 78 41 64 18 DB 60 C3 1D 09 58 82 C8 31 B6 C1 86 3A 12 D3 F9 18 82 C8 31 B6 C1 86 3A 12 B1 05 90 63 6D 83 0C 74 25 6F E4 62 0B 20 C6 DB 06 18 E8 4A C4 16 41 8D B6 0C 31 D0 95 BF 91 88 2C 83 1B 6C 18 63 A1 2B 10 59 06 36 D8 30 C7 42 56 FE 46 20 B2 0C 6D B0 61 8E 84 AC 41 64 18 DB 60 C3 1D 09 5B F9 18 82 C8 31 B6 C1 86 3A 12 B1 05 90 63 6D 83 0C 74 25 6F E4 62 0B 20 C6 DB 06 18 E8 4A C4 16 41 8D B6 0C 31 D0 95 BF 91 88 2C 83 1B 6C 18 63 A1 2B 10 59 06 36 D8 30 C7 42 56 FE 46 20 B2 0C 6D B0 61 8E 84 AC 41 64 18 DB 60 C3 1D 09 5B F9 18 82 C8 31 B6 C1 86 3A 12 B1 05 90 63 6D 83 0C 74 25 6F E4 62 0B 20 C6 DB 06 18 E8 4A C4 16 41 8D B6 0C 31 D0 95 BF 91 88 2C 83 1B 6C 18 63 A1 2B 10 59 06 36 D8 30 C7 42 56 FE 46 20 B2 0C 6D B0 61 8E 84 AC 41 64 18 DB 60 C3 1D 09 5B F9 18 82 C8 31 B6 C1 86 3A 12 B1 05 90 63 6D 83 0C 74 25 6F E4 62 0B 20 C6 DB 06 18 E8 4A C4 16 41 8D B6 0C 31 D0 95 BF 91 88 2C 83 1B 6C 18 63 A1 2B 10 59 06 36 D8 30 C7 42 56 FE 46 20 B2 0C 6D B0 61 8E 84 AC 41 64 18 DB 60 C3 1D 09 5B F9 18 82 C8 31 B6 C1 86 3A 12 B1 05 90 63 6D 83 0C 74 25 6F E4 62 0B 20 C6 DB 06 18 E8 4A C4 16 41 8D B6 0C 31 D0 95 BF 91 88 2C 83 1B 6C 18 63 A1 2B 10 59 06 36 D8 30 C7 42 56 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB FA 5B F5 F7 42 FF A5 B7 05 B1 1F F1 B7 9F C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 74 2D F9 E5 27 78 5F FC CA 85 9F F6 EB 4A 0E D1 8D AD A9 59 CC 2E F8 E1 B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C9 15 CA 50 19 92 F9 1C 68 F4 C7 37 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF C6 DB 7F 1B 6D FC 6D B7 F1 B6 DF D2 DC 88 0C 83 1A 6C 18 61 A1 23 10 19 06 34 D8 30 C3 42 4F A5 B6 20 32 0C 69 B0 61 86 84 8C 40 64 18 D3 60 C3 0D 09 3E 96 D8 80 C8 31 A6 C1 86 1A 12 31 01 90 63 4D 83 0C 34 24 FA 5B 62 03 20 C6 9B 06 18 68 48 C4 06 41 8D 36 0C 30 D0 93 E9 6D 88 0C 83 1A 6C 18 61 A1 23 10 19 06 34 D8 30 C3 42 4F A5 B6 20 32 0C 69 B0 61 86 84 8C 40 64 18 D3 60 C3 0D 09 3E 96 D8 80 C8 31 A6 C1 86 1A 12 31 01 90 63 4D 83 0C 34 24 FA 5B 62 03 20 C6 9B 06 18 68 48 C4 06 41 8D 36 0C 30 D0 93 E9 6D 88 0C 83 1A 6C 18 61 A1 23 10 19 06 34 D8 30 C3 42 4F A5 B6 20 32 0C 69 B0 61 86 84 8C 40 64 18 D3 60 C3 0D 09 3E 96 D8 80 C8 31 A6 C1 86 1A 12 31 01 90 63 4D 83 0C 34 24 FA 5B 62 03 20 C6 9B 06 18 68 48 C4 06 41 8D 36 0C 30 D0 93 E9 6D 88 0C 83 1A 6C 18 61 A1 23 10 19 06 34 D8 30 C3 42 4F A5 B6 20 32 0C 69 B0 61 86 84 8C 40 64 18 D3 60 C3 0D 09 3E 96 D8 80 C8 31 A6 C1 86 1A 12 31 01 90 63 4D 83 0C 34 24 FA 5B 62 03 20 C6 9B 06 18 68 48 C4 06 41 8D 36 0C 30 D0 93 E9 6D 88 0C 83 1A 6C 18 61 A1 23 10 19 06 34 D8 30 C3 42 4F A5 B6 20 32 0C 69 B0 61 86 84 8C 40 64 18 D3 60 C3 0D 09 3E 96 D8 80 C8 31 A6 C1 86 1A 12 31 01 90 63 4D 83 0C 34 24 FA 5B 62 03 20 C6 9B 06 18 68 48 C4 06 41 8D 36 0C 30 D0 93 E3 22 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FE 36 DB F8 DB 6F E3 6D BF 8D B6 FD 


00 00 01 B6 50 A1 DC 08 FF FF FF FF FF FF FF FF FF FF FF FF FF FD 4F C7 D5 00 4B 1A A0 09 FF FF A2 CB BE 19 9F 06 54 24 FC F0 6C 13 2C A5 86 15 06 EC E9 18 C4 47 1F 88 04 63 81 F8 32 74 82 55 2D 4E CB 4A B1 05 FB 33 C1 4F 86 E6 03 3D 26 93 85 A5 C4 20 62 F4 C2 5E 29 54 CB 49 FC 6F DF 9A 2F 70 A4 7C 96 6C E9 FE 30 03 C0 F1 72 A5 67 FF FF D5 00 E8 20 09 3F C8 7C 21 09 3E 53 1E 06 D4 08 3E 80 16 0F 40 78 0F D3 C1 87 60 75 B0 61 24 20 8E BC 95 96 15 17 25 FB 1E F4 B6 73 3D 79 87 14 12 D5 87 D4 54 80 3C 07 E7 E0 C2 50 41 07 81 FE B4 43 10 D5 17 37 F4 C3 D6 44 16 B7 25 B2 CB 05 4C BA 98 69 7E 8B 8F 21 51 66 87 3D CE 0B CF 81 BC 0F 01 05 38 30 28 C1 0C 48 06 6C 4A 1D 51 FE FD 20 F5 3B 4A 9B C6 F7 B9 73 FB 31 0A C5 0F 02 F4 07 16 5A D3 E7 01 E0 20 87 06 05 20 20 89 20 A1 1E 27 A9 9B 61 53 0C F9 BD 6E CB CC 99 BD 3E 68 10 3F BD F4 5D 69 27 45 10 86 88 82 B5 C0 5C 20 09 57 63 82 00 42 83 A7 7F FF B4 03 81 0A AF C3 E1 B4 04 31 22 E9 F0 4A 89 60 D1 A4 A5 4A D3 34 AF 0D 37 E9 BC 1A 8A 7E AA 69 00 56 D1 21 AA 80 2A 57 0D B1 D0 29 1A 49 27 95 2A F3 1E 0E 3D E9 90 2A 22 10 04 82 CB 2F 08 9E 08 CD 60 89 06 88 79 89 84 1E D8 11 04 72 43 9F FF F7 40 2D CC 0F FF FF FF FF FF FF FF FF FF FF FF FF FF FD


그럼 첫번째 청크의 샘플 데이터가 맞는지 확인 해 보자

ㄴ https://mp4explorer.codeplex.com/

로 확인해 본다.



이 프로그램을 이용하여 샘플을 확인해 보자

위와 같이 샘플을 뽑아낼 수 있으면, ts파일, flv 파일 로 전환 할 수 있다.


FLV 로 변환 하는 것은 다음 블로그에 작성 할 예정이다.