문제

나는 여러분 중 일부 가이 문제에 어떻게 접근 할 것인지 하나의 아이디어를 얻고 싶었습니다. 로봇이 있는데 Linux를 실행하고 웹캠 (V4L2 드라이버 포함)을 센서 중 하나로 사용합니다. GTKMM이있는 제어판을 작성했습니다. 서버와 클라이언트는 모두 C ++로 작성됩니다. 서버는 로봇이며 클라이언트는 "제어판"입니다. 이미지 분석이 로봇에서 발생하고 있으며 두 가지 이유로 카메라에서 제어판으로 비디오를 다시 스트리밍하고 싶습니다. a) 재미를 위해 B) 이미지 분석 결과를 오버레이합니다.

제 질문은 웹캠에서 제어판으로 비디오를 스트리밍하고 로봇 코드에 우선 순위를 부여하는 몇 가지 좋은 방법은 무엇입니까? 나는 내 자신의 비디오 압축 체계를 작성하고 기존 네트워킹 포트를 통해 새로운 네트워크 포트 (비디오 데이터 전용)를 통해 관심이 없다고 생각합니다. 문제의 두 번째 부분은 GTKMM에 비디오를 어떻게 표시합니까? 비디오 데이터는 비동기식으로 도착하며 GTKMM에서 main ()을 제어 할 수 없으므로 까다로울 것 같습니다.

VLC, GStreamer 또는 내가 모르는 다른 일반 압축 라이브러리와 같은 것을 사용할 수 있습니다.

감사해요!

편집 : 로봇에는 1GHz 프로세서가 있으며 Linux 버전과 같은 데스크탑을 실행하지만 x11은 없습니다.

도움이 되었습니까?

해결책

GSTREAMER는 거의 노력 없이이 모든 것을 해결하고 GLIB 이벤트 시스템과 잘 통합됩니다. GSTREAMER에는 V4L 소스 플러그인, GTK+ 출력 위젯, 비디오를 크기를 조정 / 인코딩 / 디코딩하는 다양한 필터, 무엇보다도 네트워크 싱크 및 소스가 포함되어있어 시스템 간 데이터를 이동시킵니다.

프로토 타입의 경우 'GST-LAUNCH'도구를 사용하여 비디오 파이프 라인을 조립하고 테스트 할 수 있으며 코드에서 프로그래밍 방식으로 파이프 라인을 만들 수 있습니다. 웹캠 등으로이를 수행하는 사람들의 예를 보려면 'GStreamer Network Streaming'을 검색하십시오.

다른 팁

사용 된 실제 기술에 대해서는 잘 모르겠지만 프레임이 떨어지는 것을 피하려면 큰 동기화가 될 수 있습니다. 동시에 비디오를 파일과 네트워크로 스트리밍하고있었습니다. 결국 내가 한 일은 3 개의 포인터와 함께 큰 원형 버퍼를 사용하는 것이 었습니다 : 1 개의 쓰기와 2 개의 읽기. 세 가지 제어 스레드 (및 일부 추가 인코딩 스레드)가있었습니다. 하나는 버퍼에 쓰기가 버퍼에서 읽지 않으면 버퍼에서 읽지 않고 버퍼에서 읽고 쓸 수있는 두 개의 리더 스레드가 있습니다. 파일/네트워크 (그리고 생산자보다 앞서 나가면 일시 중지). 모든 것이 프레임으로 쓰여지고 읽었으므로 동기화 오버 헤드는 최소한으로 유지 될 수 있습니다.

내 생산자는 트랜스 코더 (다른 파일 소스에서) 였지만, 귀하의 경우 카메라가 정상적으로 어떤 형식의 형식으로 전체 프레임을 생성하고 서버의 트랜스 코딩 (FFMPEG와 같은) 만 수행하기를 원할 수도 있습니다. 이미지를 처리합니다.

로봇은 실시간 피드백이 필요하므로 스트리밍 서버가 따라 잡을 때까지 잠시 멈추고 기다릴 수 없기 때문에 문제는 조금 더 복잡합니다. 따라서 "제어판"으로 스트리밍하기 위해 가능한 한 빨리 제어 시스템에 프레임을 제어 시스템에 가져 와서 원형 버퍼로 버퍼링 할 수 있습니다. 특정 코덱은 다른 것보다 삭제 된 프레임을 더 잘 처리하므로 네트워크가 뒤처지면 버퍼 끝에서 프레임을 덮어 쓰기 시작할 수 있습니다 (읽지 않음).

'새로운 비디오 포트'라고 말한 다음 VLC/GStreaming에 대해 이야기하기 시작하면 원하는 것을 해결하기가 어렵습니다. 분명히 이러한 소프트웨어 패키지는 여러 프로토콜을 통해 스트리밍 및 압축을 지원하지만 스트림을 보내려면 '비디오 포트'가 아닌 '네트워크 포트'가 필요합니다.

당신이 의미하는 바는 다른 문제인 무선 비디오/TV 피드를 통해 디스플레이 출력을 보내는 것이지만 소프트웨어 전문가보다는 하드웨어 전문가의 조언이 필요합니다.

계속 움직입니다. MMS/UDP 프로토콜을 통해 많은 스트리밍을 수행했으며 VLC는 (서버 및 클라이언트로서) 매우 잘 처리합니다. 그러나 데스크탑 용으로 설계되었으며 원하는만큼 가볍지 않을 수 있습니다. GSTREAMER, MENCODER 또는 FFMPEG와 같은 오버 핸드와 같은 것이 더 나을 것입니다. 로봇에는 어떤 종류의 CPU가 있습니까? 실시간 압축을 계획하고 있다면 약간의 큰 소리가 필요합니다.

클라이언트 측에서는 GTK에서 비디오를 처리 할 수있는 많은 위젯을 찾을 수 있다고 생각합니다. 인터페이스 세부 사항에 대해 걱정하기 전에 조사 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top