2009-11-06 10 views
25
0000 0109 1000 0001 6742 0020 e900 800c 
3200 0001 68ce 3c80 0000 0001 6588 801a 

Theo như tôi biết, là mã tiền tố bắt đầu để xác định đơn vị NAL. "09 ...." có nghĩa là gì? Nó là byte kiểu tiêu đề?Tiêu đề H264 NAL này có ý nghĩa gì?

Trả lời

2

Điều đó xác định loại gói. Định dạng là:

+---------------+ 
|0|1|2|3|4|5|6|7| 
+-+-+-+-+-+-+-+-+ 
|F|NRI| Type | 
+---------------+ 

Bạn có chắc đây là tiêu đề N.264 NAL không? Từ những gì bạn cung cấp, đây không phải là tiêu đề với ngữ cảnh mà bạn cung cấp.

+0

Tôi đã sử dụng công cụ phân tích luồng video để phân tích luồng video và đánh dấu ranh giới của khung. Tôi nhặt phần đầu của khung hình I. Và mã tiền tố "00 00 01" cũng cho thấy rằng đây là một NAL. – ablmf

+0

Mã tiền tố đó không cho thấy rằng đó là một NAL vì 0000 0109 là 8 byte (64 bit) và không mangling của 16 byte đầu tiên sẽ cung cấp mã tiền tố cho biết đó là NAL. Hãy nhớ rằng, bạn đang nhìn vào một bãi chứa hex nhưng tất cả các thông số kỹ thuật và định nghĩa tham chiếu đến nhị phân. – Matt

+0

err, tôi thất bại trong toán học của tôi trong các bình luận ở trên, 0000 0109 là 4 byte, không 8 (và 32 bit, không 64), nhưng vẫn sẽ không mangle ra mã tiền tố bạn đang tìm kiếm. – Matt

33

0x000001 là mã tiền tố bắt đầu NAL (cũng có thể là 0x00000001, phụ thuộc vào việc triển khai bộ mã hóa). 0x09 là 0b00001001, có nghĩa là F = 0, NRI = 0 và loại là 0b01001. Loại đặc biệt đó là dấu tách đơn vị truy cập. Lưu ý rằng nó ngay lập tức được theo sau bởi một đơn vị NAL khác được định nghĩa bởi 0x67, là một kiểu NAL là 7, là bộ tham số chuỗi.

Ngoài ra còn có các tham số hình ảnh thiết lập:

00 0001 68 ...

... và bắt đầu một keyframe:

0000 0001 65 ...

9

Các tham chiếu chính để tìm ra loại NAL bạn đang xem là http://www.itu.int/rec/T-REC-H.264-201304-S. Cụ thể, bảng ở trang 63 (tính đến tháng 1 năm 2014) liệt kê tất cả các loại NAL hợp lệ.

Để tìm hiểu xem bạn đang xem cái gì 4 byte đầu tiên. Nếu NAL nằm trong khung "Phụ lục B", chúng sẽ là hoặc . Trình tự này bị cấm/bị chặn trong luồng bit H.264 vì vậy nếu bạn thấy nó, bạn biết chắc chắn rằng bạn đang nhìn vào lúc bắt đầu một NAL. Loại NAL là 5 bit thứ tự thấp sau 1. Trong mã:

int nalType = p[2] == 1 ? (p[3] & 0x1f) : (p[4] & 0x1f); 

Cũng có nghĩa là I-frame và non-IDR có nghĩa là khung P hoặc B.

Với thông tin trên, chúng ta có thể xem luồng trên và xem dấu tách đơn vị truy cập, theo sau là SPS, PPS và I-Frame đầu tiên.

+1

_Cấu hình: _ Tất cả các khung IDR là I-frame, nhưng không phải tất cả I-frame đều là khung IDR. Khung IDR (Làm mới tức thời bộ giải mã) là các khung I đặc biệt không chỉ chứa một bức tranh hoàn chỉnh, mà còn chỉ ra rằng không có khung P/B _after_ IDR được phép tham chiếu một khung _before_ IDR. –

4
0000 0109 1000 0001 6742 0020 e900 800c 
    3200 0001 68ce 3c80 0000 0001 6588 801a 

-> 000001| 09 (AUD)| 10 | 000001 | 67(SPS) | xxxx (SPS data) 
    xx | 000001 | 68 (PPS)| xxxx (PPS data) 

AUD, SPS, PPS là loại Nalu (Network Abstraction Layer Units) Nalu có khoảng 31 loại.

09 Ký hiệu đơn vị truy cập có nghĩa là AUD.

Đơn vị truy cập Dấu phân cách (AUD). AUD là một NALU tùy chọn có thể là sử dụng để phân cách khung trong luồng cơ bản. Nó không được yêu cầu (trừ khi có quy định khác của thùng chứa/giao thức, như TS), và là thường không được bao gồm để tiết kiệm dung lượng, nhưng có thể hữu ích cho tìm sự bắt đầu của khung mà không cần phải phân tích đầy đủ từng khung NALU.

Kiểm tra điều này answer để biết thêm thông tin.

Tôi cũng có một số question về cách giải mã luồng h264 (trong iOS).

+0

Bạn có biết ý nghĩa của 10 sau 09 (AUD) không? –