Không quan trọng nếu bộ mã hóa của bạn mã hóa video ở 10FPS hoặc 30FPS, với dấu thời gian RTP bạn cho người nhận biết khoảng thời gian tạm dừng giữa hai khung là bao nhiêu. Vì vậy, bạn xác định rằng trên bay cho mỗi khung hình. Bằng cách đó bạn có thể gửi 10 khung hình trong một giây (10 khung hình/giây) và trong giây khác, bạn có thể gửi 30 khung hình (30 khung hình/giây). Bạn chỉ cần đặt dấu thời gian RTP chính xác. Và nếu tôi nhận được câu hỏi của bạn, bạn đang nghi ngờ cách thực hiện việc này ...
Để dấu thời gian bắt đầu bằng 0, bạn thêm thời gian đồng hồ treo tường bằng mili giây nhân với 100 vào dấu thời gian RTP cuối cùng hoặc bạn có thể sử dụng bất kỳ thang thời gian nào bạn muốn. Để thực hiện các bộ giải mã giải mã video 10fps với tốc độ 30fps, thêm 333.000 đến RTP timestamp cho mỗi gói ... nhưng cho phép nhìn vào ví dụ của bạn:
Frame # RTP Time Time between frames [ms]
[ 1] 0 0
[ 2] 50000 50
[ 3] 90000 40
[ 4] 420000 33
Vì vậy, nếu bạn thiết lập RTP timestamp như (Time in ms * 100000)
này, bạn sẽ làm cho tải bộ giải mã và giải mã Frame 1, sau đó tải và giải mã Frame 2, nhưng nó sẽ ngủ 50 ms (khác biệt thời gian giữa Frame 1 và Frame 2) trước khi nó vẽ Frame 2, và ...
Và như bạn có thể thấy, bộ giải mã sử dụng dấu thời gian RTP để biết khi nào hiển thị từng dấu thời gian và nó không quan tâm nếu video được mã hóa ở mức 30 hoặc 10 khung hình/giây.
Ngoài ra, nếu video là 30 khung hình/giây, điều đó không có nghĩa là mỗi giây sẽ có 30 gói RTP. Đôi khi có thể có nhiều hơn 100, do đó bạn không thể có công thức đảm bảo tính toán dấu thời gian RTP chính xác.
Tôi đoán rằng đây là những gì bạn cần ... hy vọng tôi đã giúp, không -1 tôi nếu tôi didnt ... =)
Điều đó không rõ ràng đối với tôi. Tôi đã có một [bitstream] (http://stackoverflow.com/questions/10562549/send-android-h264-capture-over-a-rtp-stream), nơi tôi đang cố gắng phân tích cú pháp và gửi cho họ rtp trhough. Vấn đề là tôi đã tự mình khắc dấu thời gian. Hiện tại tôi khá chắc chắn tôi đang làm sai (timestamp-lasttimestamp) * 100000. Tôi đặt dấu thời gian mới mỗi khi tôi đọc một nalu mới từ bitstream nhưng hình thức đó sẽ làm cho dấu thời gian khác nhau giữa các gói và gói A có thể có dấu thời gian lớn hơn Gói B! – FlaPer87
Dấu thời gian RTP cho biết thời gian tuyệt đối ngoài sự khác biệt về thời gian giữa các khung. Nếu không, nó không thể được sử dụng để đồng bộ giữa âm thanh và video. –
@RioWing Không, bạn không thể đặt giá trị thời gian 64bit tuyệt đối đáng tin cậy trong trường số nguyên 32 bit. Nó tốt hơn để làm cho nó liên quan đến 0. Điểm là dấu thời gian nên tăng tuyến tính, cùng một dấu thời gian phải phù hợp với khung AV, và bạn nên giữ giá trị CLOCK RATE trong tâm trí khi thiết lập dấu thời gian, vì vậy trong 1 AV giây 'last_frame_timestamp - first_frame_timestamp = CLOCK_RATE'. Bạn có tiêu đề mở rộng RTP để lưu trữ bất kỳ dữ liệu nào khác mà bạn muốn, như dấu thời gian chính xác (ve), v.v. – Cipi