2013-03-14 31 views
5

Tôi thiếu một số điều cơ bản trong việc dịch luồng UDP của phiên SDP thành luồng H.264 có thể giải mã được. Tôi đang thử nghiệm với một máy ảnh có khả năng H.264 và có thể phát trực tiếp luồng đó bằng trình phát. Khi tôi cố gắng phát luồng đã dịch, nó sẽ không được người chơi nhận ra (thiếu lỗi tiêu đề). Tuy nhiên tôi phải giải mã luồng UDP để có thể tích hợp điều này trong một ứng dụng Java mà có một số bộ giải mã xung quanh.Làm thế nào để chuyển đổi các gói H.264 UDP thành luồng hoặc tệp phương tiện có thể phát (chống phân mảnh)

Tôi đã thấy câu trả lời rất tốt để sau câu hỏi đã:

  1. How to process raw UDP packets so that they can be decoded by a decoder filter in a directshow source filter
  2. Problem to Decode H264 video over RTP with ffmpeg (libavcodec)

Cả hai đều có một số khác biệt nhỏ mà đang bối rối (xem dưới đây).

Nhưng trước tiên, hãy xem phần dễ dàng. Như tôi thấy từ máy ảnh có các gói SPS và PPS được gửi đi. Tất cả các gói còn lại là các khung phân mảnh được lập chỉ mục hay không.

Đối với tất cả các gói không có khung (chỉ NALUnitType 7 và 8 trong trường hợp của tôi) Tôi dải đầu RTP (12 byte) và thêm byte bắt đầu 3 x 0 byte và 1 x 1 ở phía trước (00 00 00 01) .

Đối với tất cả các gói khung phân mảnh Tôi tái tạo chúng theo mô tả câu trả lời 1. Vì vậy, cụ thể điều này có nghĩa là: Dải tiêu đề RTP (chỉ sử dụng để xác minh dữ liệu). Sau đó giải mã từ tải trọng thông tin phân đoạn:

byte đầu tiên: [3 NAL UNIT BITS | 5 BẢNG LOẠI HÌNH TIẾP THEO]
Byte thứ hai: [START BIT | END BIT | BIT RESERVED | 5 NAL UNIT BITS]

Nếu bit bắt đầu được đặt thì có tiêu đề tải trọng mới được tạo như sau: [3 NAL UNIT BITS (từ byte đầu tiên) | 5 NAL UNIT BITS (từ byte thứ hai)]
Điều này cho chúng ta NALUnitType 1 cho một slice không idr hoặc 5 cho một slice idr. Đó là theo các đặc điểm kỹ thuật.

Tôi lấy tiêu đề tải trọng mới này (1 byte) và đính kèm trọng tải mà không có tiêu đề 2 byte vào gói mới. Tất cả các mảnh liên tiếp được thêm vào cùng một cách (dải tiêu đề RTP 12 byte, dải 2 byte thông tin loại đơn vị) cho đến khi có thông tin bit kết thúc được nhìn thấy. Khi kết thúc được nhìn thấy tôi đặt byte bắt đầu (00 00 00 01) ở phía trước của gói này và ghi nó ra dòng.

Vấn đề là không thể giải mã được vì lý do không xác định. Sự khác biệt trong câu trả lời 2 của câu trả lời tôi đã đọc là byte thứ hai của tiêu đề tải trọng cũng có thể được đưa vào gói dịch đã được dịch. Nhưng tôi đã thử cả hai và vẫn không có may mắn.

Có thể có điều gì đó khác bị thiếu trong luồng mới được xây dựng? Hoặc tôi có mắc lỗi trong phân mảnh không?

+0

Nó chỉ ra rằng tiêu đề tải trọng mới của khung kết hợp là sai bằng cách nào đó. Tôi sẽ kiểm tra những gì có thể sai ở đó. – Thomas

+0

[3 NAL UNIT BITS (từ byte đầu tiên) | 5 NIT UNIT BITS (từ byte thứ hai) | 0x40] thực hiện thủ thuật. Tôi không biết tại sao. – Thomas

Trả lời