2014-10-04 18 views
5

Hiện tại, tôi đang cố gắng sử dụng opencv để đọc video từ máy ảnh Canon VB-H710F của mình.Đọc luồng h264 từ máy ảnh IP

Đối với mục đích này tôi đã cố gắng hai giải pháp khác nhau:

GIẢI PHÁP 1: Đọc các dòng từ địa chỉ rtsp

VideoCapture cam ("rtsp://root:[email protected]/stream/profile1=u"); 

while(true) 
    cam >> frame; 

Trong trường hợp này tôi đang sử dụng opencv để đọc trực tiếp từ một dòng mã hóa với trong H264 (profile1), tuy nhiên điều này mang lại cùng một vấn đề được báo cáo ở đây http://answers.opencv.org/question/34012/ip-camera-h264-error-while-decoding/ Như đã đề xuất trong câu hỏi trước, tôi đã cố tắt chức năng hỗ trợ FFMPEG trong cài đặt opencv, giải quyết lỗi giải mã h264 nhưng lại gây ra vấn đề khác. Khi truy cập luồng bằng opencv, được hỗ trợ bởi gstreame, luôn có sự chậm trễ lớn liên quan. Với giải pháp này tôi đạt được 15 FPS nhưng tôi có một sự chậm trễ 5 giây, đó là không thể chấp nhận được xem xét rằng tôi cần một ứng dụng thời gian thực.

GIẢI PHÁP 2: Đọc các khung từ địa chỉ http khi (đúng) { startTime = System.currentTimeMillis();

 URL url = new URL("h t t p://[IP]/-wvhttp-01-/image.cgi"); 
     URLConnection con = url.openConnection(); 
     BufferedImage image = ImageIO.read(con.getInputStream()); 
     showImage(image); 
     estimatedTime=System.currentTimeMillis()-startTime; 
     System.out.println(estimatedTime); 
     Thread.sleep(5); 
} 

Chiến lược này chỉ lấy khung từ url mà máy ảnh cung cấp. Mã nằm trong Java nhưng các kết quả giống nhau trong C++ với thư viện curl. Giải pháp này tránh sự chậm trễ của giải pháp đầu tiên tuy nhiên phải mất ít hơn 100 ms để lấy từng khung hình, có nghĩa là tôi chỉ có thể đạt được trung bình 10 FPS.

Tôi muốn biết làm cách nào để đọc video bằng C++ hoặc thư viện khác được phát triển bằng C++?

Trả lời

0

Cá nhân, tôi khuyên bạn nên sử dụng ffmpeg để đọc luồng rtsp từ máy ảnh IP, sau đó sử dụng openCV để đọc từ bộ đệm được giải mã từ ffmpeg. ffmpeg có tối ưu hóa rất tốt đối với giải mã H.264, hiệu suất không phải là một vấn đề quan trọng.

Bạn có thể sử dụng hệ nhị phân ffmpeg để xác minh xem điều này có thể làm việc một cách chính xác:

ffmpeg -i "rtsp://root:[email protected]/stream/profile1=u" -vcodec copy -acodec none test.mp4 

Nếu test.mp4 có thể chơi thành công, sau đó nó chắc chắn OK để bạn có thể tích hợp libs ffmpeg vào dự án của bạn.

Chúc may mắn!

+0

Thank cho câu trả lời của bạn. Mặc dù có thể ghi lại thành công video ở tốc độ 15 khung hình/giây, giải pháp này không phù hợp với mục đích của tôi, vì trong ví dụ của bạn, ffmpeg chỉ sao chép video vào một tệp mà không cần giải mã và trong trường hợp của tôi, tôi cần phải giải mã trong thời gian thực. –

+0

Có, tôi hiểu bạn cần phải trích xuất các khung hình và xử lý trên mỗi khung hình.Ví dụ ffmpeg là một thử nghiệm cho dù tín hiệu đầu vào có chính xác cho việc xử lý cũng như có thể được xử lý chính xác bằng ffmpeg hay không. Khi bạn đã xác minh, bây giờ bạn có thể bắt đầu biên dịch các thư viện ffmpeg và sử dụng ffmpeg lib để giải mã các khung theo cách thủ công bằng cách sử dụng mã và dữ liệu khung sẽ có sẵn cho bạn trong đường dẫn giải mã. Hướng dẫn phát triển ffmpeg khác nhau có sẵn trên internet. – JasonYang

+0

Tôi đã thử điều đó, nhưng vấn đề vẫn còn kể từ khi tôi chỉ có thể truy cập khung của 2 giây trong quá khứ (tôi nghĩ rằng đó là liên quan đến kích thước bộ đệm của ffmpeg). Bạn có biết một số cách để giảm kích thước của bộ đệm này trong khi vẫn duy trì giải mã thời gian thực không? Tôi đã tìm kiếm trên web nhưng tôi không thể tìm thấy bất kỳ giải pháp nào. Cám ơn bạn một lần nữa –

4

Tôi đã gặp khó khăn với các vấn đề tương tự và nghĩ rằng tôi đã giải quyết được một số vấn đề của bạn bằng cách sử dụng libVLC với OpenCV. FFMPEG dường như có vấn đề không giải mã đúng H264, cộng với các phiên bản mới hơn (2.4.11) dường như đã sửa lỗi TCP trong đó đã có cho FFMPEG. Dù sao, tôi sử dụng MS Visual Studio trên Windows 7 và 8.1.

tin chi tiết được đưa ra ở đây: http://answers.opencv.org/question/65932

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