2012-06-29 13 views
6

Tôi cần trợ giúp về luồng video decodein rtsp. Tôi lấy nó từ camera IP AXIS. Tôi sử dụng thư viện ffmpeg cho nó. Cần thiết phải tạo riêng AVCodecContext, không phải từ AVFormatContext-> stream [...] -> codec;Giải mã h264 rtsp bằng ffmpeg và tách AVCodecContext

Vì vậy, tôi tạo AVCodec, AVCOdecContext và thử khởi động chúng.

AVCodec *codec=avcodec_find_decoder(codec_id); 
if(!codec) 
{ 
    qDebug()<<"FFMPEG failed to create codec"<<codec_id; 
    return false; //--> 
} 

AVCodecContext *context=avcodec_alloc_context3(codec); 
if(!context) 
{ 
    qDebug()<<"FFMPEG failed to allocate codec context"; 
    return false; //--> 
} 
avcodec_open2(context, codec, NULL); 

Sau đó, trong vòng lặp chính của ứng dụng, tôi nhận được dữ liệu khung và cố gắng để giải mã:

_preallocatedFrame = avcodec_alloc_frame(); 
avcodec_decode_video2(_context, _preallocatedFrame, &got_picture, &_packet); 

Và ở đây tôi nhận được rất nhiều tin nhắn trong giao diện điều khiển:

[h264 @ 1f177720] decode_slice_header error 
[h264 @ 1f177720] no frame! 
[h264 @ 1f177720] non-existing PPS 0 referenced 
[h264 @ 1f177720] decode_slice_header error 
[h264 @ 1f177720] no frame! 
[h264 @ 1f177720] non-existing PPS 0 referenced 
[h264 @ 1f177720] decode_slice_header error 
[h264 @ 1f177720] no frame! 
[h264 @ 1f177720] non-existing PPS 0 referenced 
[h264 @ 1f177720] decode_slice_header error 
[h264 @ 1f177720] no frame! 
[h264 @ 1f177720] non-existing PPS 0 referenced 
[h264 @ 1f177720] decode_slice_header error 
[h264 @ 1f177720] no frame! 
[h264 @ 1f177720] non-existing PPS 0 referenced 
[h264 @ 1f177720] decode_slice_header error 
[h264 @ 1f177720] no frame! 

có thể cho bạn lời khuyên tôi một cái gì đó, làm thế nào để init AVCodecContext hoặc cái gì khác để làm điều đó đúng?

Trả lời

4

Bạn cần thực hiện thêm một số công việc. nếu bạn muốn giải mã luồng h.264, bạn cần chuyển bộ giải mã dữ liệu "sps pps". Dữ liệu này có thể được tìm thấy trên luồng rtp chính nó see

hoặc trong đàm phán rtsp trong SDP. sau khi bạn nạp bộ giải mã thành công với dữ liệu này, quá trình giải mã sẽ hoạt động.

+0

Ok, nhưng ở đâu khác biệt. Khi tôi nhận được AVCodecContext từ AVFormatContext-> stream [...] -> codec, và thực hiện các hoạt động hoàn toàn tương tự, nó giải mã mà không có lỗi. Bt nó là cần thiết để tôi sử dụng codeccontext tách biệt (nó có thể được giải mã sau khi nhận dữ liệu từ kho lưu trữ, lưu trên đĩa, khi tôi không thể định dạng ngữ cảnh hav) – mmmaaak

+0

Bạn đã thử so sánh 2 đối tượng ngữ cảnh chưa? – Horonchik

+0

Có, có hơn 20 sự khác biệt giữa chúng. Tôi đã cố gắng thiết lập tất cả các trường khác nhau cho ngữ cảnh của mình, ngoại trừ AVCOdecContext-> priv_data và các trường con trỏ khác - nó không hoạt động. – mmmaaak