2012-03-06 18 views
10

Tôi không thể tìm thấy giải pháp cho my previous question vì vậy tôi quyết định thử từng bước một.Cách ghi luồng RTP/H264 dưới dạng tệp

Điều mà tôi muốn làm bây giờ là lưu trữ luồng RTP/H264 dưới dạng tệp.

Những gì tôi tìm thấy cho đến nay là dưới đây:

(trước hết tôi RTP/H264 là FU-A mà là hình thức)

| RTP HEADER 12bytes long | FU INDICATOR 1byte | FU HEADER 1byte | FU payload | 

Như tôi hiểu RFC 6184 tài liệu, tôi bắt đầu một NAL với một gói có '1' ở bit đầu tiên của FU Header và gắn thêm các gói sau đặt '0' ở bit đầu tiên cho đến gói cuối cùng có '1' ở bit thứ hai của FU Header.

Tôi nghĩ đó là cách để có được một NAL hoàn chỉnh trước khi gói tin FU-A và những gì tôi tìm thấy là tôi cần phải đặt 'bit bắt đầu' (0x00000001) ở phía trước của mỗi NAL hoàn chỉnh.

Nhưng không may mắn cho đến nay. Dưới đây là một phần của bản ghi

========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= adding the next NAL as 716 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ... 
========= a NAL is summed up as 4866 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= adding the next NAL as 139 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ... 
========= a NAL is summed up as 7061 
========= the new NAL is as 1377 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]41/1000001 [5]E4/11100100 [6]40/1000000 [7]1A/11010 ... 
========= a NAL is summed up as 1369 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E6/11100110 [7]60/1100000 ... 
========= adding the next NAL as 94 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E6/11100110 [7]60/1100000 ... 
========= a NAL is summed up as 1472 
========= the new NAL is as 447 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]41/1000001 [5]E8/11101000 [6]80/10000000 [7]16/10110 ... 
========= a NAL is summed up as 439 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EA/11101010 [7]A0/10100000 ... 
========= adding the next NAL as 1174 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EA/11101010 [7]A0/10100000 ... 
========= a NAL is summed up as 2552 
========= the new NAL is as 1400 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EC/11101100 [7]C0/11000000 ... 
========= adding the next NAL as 1364 
[0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EC/11101100 [7]C0/11000000 ... 
========= a NAL is summed up as 2742 
========= the new NAL is as 1400 
... 

câu hỏi của tôi là,

  1. nếu tôi có thể nhận được NALs hoàn chỉnh từ các gói tin bị phân mảnh bởi FU-A, làm thế nào tôi có thể làm cho nó như là một tập tin đó là có thể chạy bằng VLC hoặc trình phát khác không?

  2. Tôi vẫn còn bối rối nếu tôi phải giữ chỉ báo FU và tiêu đề FU hay không. Ai đó nói tôi chỉ cần lấy chúng cho gói đầu tiên (bắt đầu bằng '1' ở tiêu đề FU)

Bất kỳ lời khuyên nào cũng sẽ được đánh giá cao.

Cảm ơn.

+0

Hey, tôi đang cố gắng làm điều tương tự .. Tôi đọc RFC 6184 và cố gắng làm theo các bước tương tự và lưu nó vào một tệp .. Nhưng tệp của tôi dường như không chơi ... Có thể bạn vui lòng đăng giải pháp bạn đã sử dụng? Câu hỏi này có hơn 7k lượt xem .. Nó sẽ hữu ích cho tất cả chúng ta .. –

Trả lời

5
  1. Một tùy chọn là chuyển dữ liệu vào định dạng tệp như mp4 hoặc avi để có thể phát bằng VLC. AFAIR avi phù hợp với H.264 (không thể nhớ lý do tắt). Có các thư viện miễn phí như libmp4 hoặc bật nếu bạn đang sử dụng các cửa sổ bằng DirectShow, Geraint's mp4mux.

    Một lựa chọn khác là sử dụng ffmpeg để chuyển đổi một tập tin 0,264 thành mp4

    ffmpeg -i test.264 test.mp4

    này giả định rằng các tập tin chứa 0,264 đơn vị NAL phân cách bằng mã bắt đầu .

  2. Từ RFC6184

    Tải trọng FU gồm mảnh vỡ của payload của phân mảnh đơn vị NAL để nếu các trọng tải đơn vị phân mảnh liên tiếp FUS được tuần tự nối, tải trọng của phân mảnh NAL đơn vị có thể được xây dựng lại.Các đơn vị NAL loại octet của phân mảnh đơn vị NAL không được bao gồm như vậy trong tải trọng đơn vị phân mảnh, mà là thông tin của các đơn vị NAL octet của đơn vị NAL phân mảnh được chuyển tải trong các lĩnh vực F và NRI của FU chỉ số octet của đơn vị phân mảnh và trong trường loại tiêu đề FU. Một tải trọng FU CÓ THỂ có bất kỳ số octet nào và MAY trống.

    Bạn sẽ cần phải tái tạo lại các đơn vị NAL ban đầu trước khi viết nó vào file 0,264 nếu bạn muốn tiếp cận thứ hai được nêu trong 1.

+0

Cảm ơn một lần nữa Ralf, btw Tôi thực sự tự hỏi tôi nên làm gì với sps, pps. Hiện tại NAL hoàn chỉnh mà tôi đang xây dựng lại không có sps, pps packet. Tôi nghĩ rằng tôi phải đặt chúng trước khi gói đầu tiên của luồng hoặc cần phải có một AVCodecContext khởi tạo với các sps, pps. Bạn nghĩ như thế nào?? – Jun

+0

Ok, tôi đã thực hiện một số tiến bộ. Tôi đặt các gói sps, pps ở phần đầu của luồng và chỉnh sửa mỗi tiêu đề nal được xây dựng lại từ 2bytes (nó vẫn bao gồm chỉ báo FU, tiêu đề FU) thành 1byte như ban đầu. bây giờ elecard phân tích dòng đọc các tập tin nhưng vẫn không thể đọc được cho vlc hoặc bất kỳ máy nghe nhạc khác, nhưng nếu tôi chuyển đổi này thành mp4 bởi 'ffmpeg -i src.mp4 con.mp4', con.mp4 có thể được chơi bởi người chơi video nói chung. – Jun

+0

Nhưng tôi cần phải giải mã các tập tin bằng ffmpeg api trong máy nghe nhạc của riêng tôi, vì vậy tôi phải làm cho nó chạy mà không cần chuyển đổi. Nó nên được giải mã bởi ffmpeg api avcodec_decode_video2() .. lời khuyên nào ???? – Jun

6

Các đơn vị FU, STAP, và MTAP NAL là cụ thể chỉ để đóng gói RTP khi chúng được thiết kế để tạo thuận lợi cho việc vận chuyển mạng. Nói cách khác, không tính vào một bộ giải mã phân tích chúng một cách chính xác. Cuối cùng, bạn cần phải tập hợp lại các đơn vị NAL như trong trường hợp gói FU, hoặc chia chúng thành nhiều đơn vị NAL trong trường hợp STAP/MTAP.

Khi bạn có đơn vị NAL (và điều này bao gồm PPS, SPS, SEI, phân đoạn lát và tất cả các loại khác trong phạm vi 1-23), bạn có thể ghi vào đĩa cùng với mã bắt đầu '0001' cho mỗi H.264 phụ lục B.

Việc đặt dòng phụ H.264 B vào vùng chứa như MPEG-4 có thể được thực hiện với nhiều công cụ dòng lệnh khác nhau (tôi chắc chắn ffmpeg có thể làm điều đó).