2012-04-04 37 views
5

Hãy tưởng tượng tôi có các khung AnxB H.264 đến từ cuộc trò chuyện trong thời gian thực. Cách tốt nhất để đóng gói trong luồng truyền tải MPEG2 trong khi duy trì thông tin thời gian cho phát lại tiếp theo là gì?đóng gói tốc độ khung hình H.264 luồng trong luồng truyền tải MPEG2

Tôi đang sử dụng thư viện libavcodec và libavformat. Khi tôi có được con trỏ đến đối tượng (* pcc) của loại AVCodecContext, tôi thiết lập các foll.

pcc->codec_id = CODEC_ID_H264; 
pcc->bit_rate = br; 
pcc->width = 640; 
pcc->height = 480; 
pcc->time_base.num = 1; 
pcc->time_base.den = fps; 

Khi tôi nhận đơn vị NAL, tôi tạo AVPacket và gọi av_interleaved_write_frame().

AVPacket pkt; 
av_init_packet(&pkt); 
pkt.flags |= AV_PKT_FLAG_KEY; 
pkt.stream_index = pst->index; 
pkt.data = (uint8_t*)p_NALunit; 
pkt.size = len; 

pkt.dts = AV_NOPTS_VALUE; 
pkt.pts = AV_NOPTS_VALUE; 

av_interleaved_write_frame(fc, &pkt); 

tôi về cơ bản có hai câu hỏi:

1) Đối với tốc độ khung hình biến đổi, là có một cách để không xác định foll. pcc-> time_base.num = 1; pcc-> time_base.den = fps; và thay thế bằng thứ gì đó để biểu thị tốc độ khung hình biến đổi?

2) Trong khi gửi gói, tôi nên gán "dấu thời gian" cho pkt.dts và pkt.pts?

Ngay bây giờ, khi tôi phát đầu ra bằng cách sử dụng ffplay, nó đang phát ở tốc độ khung hình không đổi (fps) mà tôi sử dụng trong mã ở trên.

Tôi cũng rất muốn biết cách điều chỉnh độ phân giải không gian khác nhau. Trong luồng mà tôi nhận được, mỗi khung hình chính được đặt trước bởi SPS và PPS. Tôi biết bất cứ khi nào độ phân giải không gian thay đổi. Có cách nào không phải chỉ định pcc-> width = 640; pcc-> height = 480; trả trước? Nói cách khác, chỉ ra rằng độ phân giải không gian có thể thay đổi giữa luồng.

Thanks a lot, Eddie

Trả lời

0

DTS và PTS được đo bằng một chiếc đồng hồ 90 KHz. Xem ISO 13818 phần 1 phần 2.4.3.6 cách xuống dưới bảng cú pháp.

Đối với tỷ lệ khung hình biến đổi, khung của bạn có thể hoặc không thể tạo cách này (vui_parameters.fixed_frame_rate_flag = 0). Liệu phần mềm phát lại có xử lý nó hay không là một câu hỏi khác. Hầu hết người chơi giả định tốc độ khung cố định bất kể PTS hoặc DTS. mplayer thậm chí không thể tính tỷ lệ khung hình chính xác cho luồng truyền tải cố định được tạo bởi ffmpeg.

Tôi nghĩ nếu bạn định thay đổi độ phân giải, bạn cần kết thúc luồng (nal_unit_type 10 hoặc 11) và bắt đầu một chuỗi mới. Nó có thể nằm trong cùng một luồng truyền tải (giả sử khách hàng của bạn không quá đơn giản).

Các vấn đề liên quan