2014-10-04 4 views
5

현재, opencv를 사용하여 Canon VB-H710F 카메라에서 비디오를 읽으려고합니다. 직접 H264로 인코딩 된 스트림에서 읽을 내가 OpenCV의를 사용하고이 경우 RTSP 주소IP 카메라에서 h264 스트림 읽기

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

while(true) 
    cam >> frame; 

에서 스트림을 읽어

해결 방법 1 :이를 위해

나는 두 개의 서로 다른 솔루션을 시도 (profile1) 그러나 이것은 여기에보고 된 동일한 문제를 야기합니다. http://answers.opencv.org/question/34012/ip-camera-h264-error-while-decoding/ 이전 질문에서 제안했듯이, opencv 설치에서 FFMPEG 지원을 비활성화하려고 시도했는데, h264 디코딩 오류를 해결했지만 다른 문제가 발생했습니다. gstreame에서 지원하는 opencv로 스트림에 액세스 할 때 항상 큰 지연이 연결됩니다. 이 솔루션을 사용하면 15FPS를 얻을 수 있지만 5 초의 지연이 있습니다. 이는 실시간 응용 프로그램이 필요하다고 생각하면 받아 들일 수 없습니다.

해결 방법 2 : HTTP 주소에서 프레임을 읽어 동안 (사실) { 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); 
} 

이 전략은 카메라가 제공하는 URL의 프레임을 간단히 표시합니다. 코드는 Java이지만 C++에서는 curl 라이브러리와 결과가 동일합니다. 이 솔루션은 첫 번째 솔루션의 지연을 피하지만 각 프레임을 잡기 위해 100ms가 넘지 않아 평균 10 FPS 만 달성 할 수 있습니다.

C++ 또는 C++로 개발 된 다른 라이브러리를 사용하여 비디오를 읽는 방법을 알고 싶습니다.

답변

0

개인적으로 ffmpeg를 사용하여 IP 카메라에서 rtsp 스트림을 읽은 다음 openCV를 사용하여 ffmpeg에서 디코딩 된 버퍼를 읽을 것을 제안합니다. ffmpeg는 H.264 디코딩에 대한 아주 좋은 최적화를 가지고 있습니다. 성능이 중요한 문제는 아닙니다.

당신이 제대로 작동 할 수 있는지 여부를 확인하기는 FFmpeg 바이너리를 사용할 수 있습니다

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

test.mp4이 성공적으로 재생할 수있는 경우에 당신은 당신의 프로젝트로는 FFmpeg libs와 통합을 위해, 그것은 확실히 OK입니다.

행운을 빈다.

+0

답장을 보내 주셔서 감사합니다. 귀하의 예제에서 ffmpeg는 비디오를 디코딩없이 파일로 복사하기 때문에 제 경우에는 15fps로 비디오를 성공적으로 레코딩 할 수 있지만이 솔루션은 제 목적에 맞지 않습니다. 제 경우에는 실시간으로 디코딩해야합니다. –

+0

예, 프레임을 추출하고 각 프레임에서 처리해야한다는 것을 알고 있습니다.ffmpeg 예제는 입력 신호가 ffmpeg를 사용하여 올바르게 처리 될 수있을뿐만 아니라 처리가 올바른지 테스트하는 것입니다. 확인한 것처럼 이제 ffmpeg 라이브러리를 컴파일하고 ffmpeg lib를 사용하여 코드를 사용하여 프레임을 수동으로 디코딩 할 수 있으며 디코딩 파이프 라인에서 프레임 데이터를 사용할 수 있습니다. 다양한 ffmpeg 개발 매뉴얼이 인터넷에서 제공됩니다. – JasonYang

+0

나는 이미 그것을 시도했지만, 나는 단지 2 초의 프레임에 접근 할 수 있기 때문에 문제가 남아있다. (나는 그것이 ffmpeg의 버퍼 크기와 관련이 있다고 생각한다.) 실시간 디코딩을 유지하면서이 버퍼의 크기를 줄이는 방법을 알고 있습니까? 이미 웹을 검색했지만 어떤 해결책도 찾을 수 없었습니다. 다시 감사합니다 –

4

비슷한 문제로 고민하고 OpenCV에서 libVLC를 사용하여 문제를 해결했다고 생각합니다. FFMPEG는 제대로 H264를 해독하지 못하는 문제가있는 것 같았으며, 최신 버전 (2.4.11)에는 이미 FFMPEG에 대한 TCP 수정 사항이있는 것으로 보입니다. 어쨌든, 저는 Windows 7 및 8.1에서 MS Visual Studio를 사용합니다.

자세한 내용은 여기에 있습니다. http://answers.opencv.org/question/65932

관련 문제