Tôi có luồng H.264 thô từ Máy ảnh IP được đóng gói trong khung RTP. Tôi muốn lấy dữ liệu H.264 thô vào một tệp để tôi có thể chuyển đổi nó với ffmpeg
.H.264 trên RTP - Xác định SPS và PPS Frames
Vì vậy, khi tôi muốn viết dữ liệu vào tập tin H.264 liệu của tôi, tôi phát hiện ra nó phải giống như thế này:
00 00 01 [SPS]
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1] // Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received] // From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....
Vì vậy, tôi nhận được SPS
và PPS
từ Session Description Protocol
ra khỏi tôi trước thông tin liên lạc RTSP
. Ngoài ra, máy ảnh sẽ gửi SPS
và PPS
trong hai tin nhắn đơn trước khi bắt đầu với chính luồng video đó.
Vì vậy, tôi nắm bắt được các thông điệp theo thứ tự này:
1. Preceding RTSP Communication here (including SDP with SPS and PPS)
2. RTP Frame with Payload: 67 42 80 28 DA 01 40 16 C4 // This is the SPS
3. RTP Frame with Payload: 68 CE 3C 80 // This is the PPS
4. RTP Frame with Payload: ... // Video Data
Sau đó đến một số Frames với Payload và tại một số điểm một khung với Marker Bit = 1
RTP. Điều này có nghĩa là (nếu tôi hiểu đúng) rằng tôi có một khung hình video hoàn chỉnh. Afer này tôi viết trình tự tiền tố (00 00 01
) và NAL
từ tải trọng một lần nữa và tiếp tục với thủ tục tương tự.
Bây giờ máy ảnh của tôi gửi cho tôi sau mỗi 8 Khung hình video hoàn chỉnh SPS
và PPS
một lần nữa. (Một lần nữa trong hai khung RTP, như đã thấy trong ví dụ trên). Tôi biết rằng đặc biệt là PPS
có thể thay đổi giữa phát trực tiếp nhưng đó không phải là vấn đề.
câu hỏi của tôi bây giờ là:
1. Tôi có cần phải viết SPS/PPS mỗi khung Video 8?
Nếu số SPS
và số PPS
của tôi không thay đổi thì đủ để viết vào đầu tệp của tôi và không có gì khác?
2. Cách phân biệt giữa SPS/PPS và Khung RTP bình thường?
Trong mã C++ của tôi phân tích dữ liệu được truyền, tôi cần tạo sự khác biệt giữa các khung RTP với Payload bình thường, một cái mang theo số SPS/PPS
. Làm thế nào tôi có thể phân biệt chúng? Khung hình SPS/PPS
thường nhỏ hơn, nhưng đó không phải là một cuộc gọi tiết kiệm. Bởi vì nếu tôi bỏ qua chúng tôi cần phải biết dữ liệu nào tôi có thể vứt bỏ, hoặc nếu tôi cần viết chúng tôi cần đặt Tiền tố 00 00 01
trước mặt chúng. ? Hay đó là một quy tắc cố định mà chúng xuất hiện ở mỗi Khung Video 8?
Cảm ơn câu hỏi này. Tôi có cùng một câu hỏi như bạn. Tôi đọc qua mã nguồn live555 và không biết tại sao họ lưu từng gói/khung như thế. Sau khi đọc chủ đề này, mọi thứ trở nên rõ ràng với tôi. Như một gợi ý dựa trên việc thực hiện live555, bit đánh dấu chỉ được sử dụng trong các codec khác, H264 có start_bit và end_bit riêng để biểu diễn cho đầu/cuối của khung, bit đánh dấu không được sử dụng cho H264. – user534498