개발자

파이썬 실시간 영상 스트리밍 관련 질문입니다!

2024년 03월 08일조회 242

안녕하세요 선배님들 도움을 받고자 이렇게 글 남겨봅니다! 현재 IP 카메라를 이용해서 실시간으로 영상 데이터를 받고 파이썬의 opencv 를 이용해 영상을 웹화면에 띄워주기 위한 프로그래밍을 하고 있습니다. 영상은 송출이 되는 상황인데 문제는 해당 사람을 촬영한다고 가정했을때 사람이 팔을 들어 올리는 장면이 있으면 대략 6초~8초 뒤에서야 웹에서 보여지는 영상에 사람이 팔을 들고 있고 그것도 자연스럽게 보이는게 아니라 프레임이 끊기면서 보이는 문제가 있습니다.. 코드 흐름 자체는 opencv 를 통해서 영상 데이터 받고 데이터 전처리 후처리 작업을 하고 처리 된 데이터를 Thread 를 이용해서 queue에 넣고 사용하는 방식으로 처리하고 있습니다. 혹시나 데이터 전처리 후처리하는 작업과정에서 처리 비용이 많이 드는건가 싶어서 일반 저장된 영상으로 테스트를 해봤는데 저장된 영상은 정상적인 속도로 나오고 있는 상황입니다. 이럴때는 보통 어떻게 해결하시는 지 알려주시면 감사하겠습니다!!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

정현석님의 프로필 사진

코드는 이렇게 되어있습니다!

1class Camera:
2    def __init__(self, source, PT_PATH):
3        self.capture = cv2.VideoCapture(source)
4        if not PT_PATH == "original":
5            self.model = load_model(PT_PATH)
6        else:
7            self.model = "original"
8        self.streaming_state = False
9        self.frame_queue = queue.Queue()
10        self.thread = threading.Thread(target=self.read_frames, args=())
11
12    def start(self):
13        self.streaming_state = True
14        self.thread.start()
15
16    def stop(self):
17        self.streaming_state = False
18        while not self.frame_queue.empty():
19            try:
20                self.frame_queue.get_nowait()
21            except queue.Empty:
22                break
23        self.capture.release()
24        print("메모리에서 해제된 후 상태 : ",self.capture.isOpened())
25
26
27    def read_frames(self):
28        while self.streaming_state:
29            # print("capture 상태 : ",self.capture.isOpened())
30            success, capture_img = self.capture.read()
31            if not success:
32                print("더이상 읽어올 Frame이 존재하지 않습니다.")
33                break
34            
35            if not self.model == "original":
36                pre_process_image, model_to_device = preprocess_frame(capture_img=capture_img, model=self.model)
37                post_process_image = postprocess_frame(pre_process_image, capture_img, model_to_device)
38                self.frame_queue.put((b'--frame\r\n'
39                        b'Content-Type: image/jpeg\r\n\r\n' + post_process_image + b'\r\n'))
40            else:
41                capture_img = httpProcessing(capture_img=capture_img)
42                self.frame_queue.put((b'--frame\r\n'
43                        b'Content-Type: image/jpeg\r\n\r\n' + capture_img + b'\r\n'))
44
45    
46    def get_frame(self):
47        while True:
48            if self.frame_queue.empty():
49                continue
50            yield self.frame_queue.get()

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 03월 08일

안녕하세요, 당신의 프로젝트가 흥미로운 것 같네요. 영상 스트리밍에 딜레이가 발생하는 원인은 여러 가지일 수 있습니다. 1. 네트워크 지연: 이는 비디오 스트림이 IP 카메라에서 클라이언트까지 무선/유선 네트워크를 거쳐 전송되는 동안 발생할 수 있는 지연으로, 이는 아마도 가장 일반적인 원인 중 하나입니다. 이 경우 네트워크 속도를 향상시키거나, 동영상을 보내기 전에 압축하거나 다운샘플링하는 등의 방법을 사용하여 해결해볼 수 있습니다. 2. 처리 시간: OpenCV를 사용하여 이미지 처리를 하는 경우, 이 공정이 속도 저하의 원인일 수 있습니다. 코드 최적화나 더 간단한 알고리즘 사용, GPU 가속 등으로 처리 시간을 단축시킬 수 있습니다. 3. 쓰레딩과 동기화 문제: Thread 와 queue를 사용하는 것은 좋은 생각이지만, 쓰레딩과 동기화에 따른 오버헤드가 딜레이를 초래할 수 있습니다(특히 큐가 가득 차거나 비워졌을 때). 이를 해결하기 위해서는 쓰레드 수를 최적화하거나, 더 효율적인 동기화 메커니즘을 사용해야 할 수 있습니다. 4. 클라이언트-서버 아키텍처: RTSP 스트리밍에는 전송 지연이 있는데, 이것은 클라이언트가 데이터를 버퍼링하고 프레임 별로 디코딩하는 방식때문입니다. 이 딜레이를 줄이기 위해선, 클라이언트 측에서의 버퍼링 시간을 최소화하거나 비디오 스트림 자체의 품질(예: 비트레이트 혹은 해상도)을 낮추어야 합니다. 위의 가능한 원인들에 따라 대응 방안을 모색해보세요. 기존에 저장된 영상으로 테스트할 때는 문제가 없다면서요, 그렇다면 네트워크 지연 혹은 서버-클라이언트 사이의 문제일 가능성도 있습니다. 첫 번째로 네트워크 상태와 설정을 점검해 보시길 권장드립니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!