3

나는 시뮬레이션 애니메이션을 렌더링하고 초당 여러 PNG 이미지 파일을 출력하고 이러한 파일을 디스크에 저장하는 Open GL 응용 프로그램을 보유하고 있습니다. 이 이미지 파일을 HTTP 프로토콜로 스트리밍하는 비디오로 스트리밍하여 웹 브라우저에서 애니메이션 비디오를 볼 수 있습니다. 이미 websocket에서 연결을 처리하는 견고한 소켓 서버가 있으며 모든 핸드 쉐이크 및 메시지 인코딩/디코딩 부분을 처리 할 수 ​​있습니다. 내 서버 프로그램과 OpenGL 응용 프로그램은 C++로 작성되었습니다.연속 PNG 출력 이미지 파일을 웹 브라우저에서 라이브 비디오 스트리밍으로 인코딩

마음에 몇 가지 질문 :

  1. 이 OpenGL을 애니메이션 출력 스트림 내 웹 브라우저에서 볼 수있는 가장 좋은 방법은 무엇입니까? 비디오 이미지 프레임은 OpenGL 응용 프로그램에서 PNG 이미지 파일로 동적으로 (연속적으로) 생성됩니다. 웹 브라우저는 OpenGL 디스플레이 출력에 해당하는 비디오를 표시해야합니다 (최소 지연 시간 포함).

  2. 어떻게 C/C++를 사용하여 프로그래밍 방식으로 연속 (라이브) 비디오로 인코딩 할 수 있습니까? (수동으로 이미지 파일을 Flash Media Live Encoder와 같은 스트리밍 서버 소프트웨어로 푸시하지 않고)? 어떤 비디오 형식을 만들어야합니까?

  3. 웹 소켓을 사용하여 애니메이션 데이터를 송수신해야합니까? 아니면 더 좋은 방법이 있습니까? (JQuery Ajax가 대신 호출하는 것처럼,이 작업을 수행하고 있지만이를 구현하는 올바른 방법을 안내해 준다). 이 라이브 비디오 스트리밍이 다른 브라우저에서 작동하면 좋을 것입니다.

  4. HTML5 동영상 태그는 실시간 동영상 스트리밍을 지원합니까, 아니면 특정 URL/디렉토리 (실시간 스트리밍이 아닌)에있는 전체 동영상 파일에서만 작동합니까?

  5. C/C++/Java 응용 프로그램에서 일부 이미지 프레임을 생성하는이 라이브 비디오 스트리밍을 수행하고 웹 브라우저에서이 출력을 비디오 스트리밍으로 사용하는 기존 코드 샘플 (자습서)이 있습니까? Google에서 검색하는 데 몇 시간을 소비 한 후에이 주제에 대한 자습서를 거의 찾을 수 없었습니다.

답변

3

PNG 파일을 디스크로 출력하는 것을 중단하고 대신 이미지 데이터의 프레임을 비디오 인코더에 입력하려고합니다. 좋은 방법은 libav/ffmpeg를 사용하는 것입니다. 그런 다음 인코딩 된 비디오를 네트워크 친화적 인 형식으로 캡슐화해야합니다. 인코더 및 MPEG4 또는 MPEG2TS 스트림 형식으로 x264를 권장합니다.

웹 브라우저에서 동영상을 보려면 스트리밍 형식을 선택해야합니다. HTML5의 HLS는 Safari에서 지원하지만 불행히도 그다지 많지 않습니다. 와이드 클라이언트 지원을 위해서는 플래시 또는 미디어 플레이어와 같은 플러그인을 사용해야합니다.

내가 이것을 할 수있는 가장 쉬운 방법은 Wowza를 사용하여 서버 측 복원을 수행하는 것입니다.GL 프로그램은 MPEG2 TS를 Wowza로 스트리밍 한 다음 HLS, RTMP (플래시), RTSP 및 Microsoft Smooth Streaming (Silverlight) 용 스트림을 준비합니다. Wowza 비용은 약 $ 1000입니다. 무료 인 Red5를 사용하여 RTMP 스트림을 설정할 수 있습니다. 또는 VLC로 RTSP를 제공 할 수 있지만 RTSP 클라이언트는 일반적으로 끔찍합니다.

현재로서는 웹 비디오의 표준화 수준이 매우 낮아 비디오 툴링이 다소 번거 롭습니다. 큰 사업이지만 ffmpeg/libav로 해킹 당할 수 있습니다. 개념 증명은 ffmpeg가 청취하는 파이프에 YUV420p 형식의 이미지 프레임을 쓰고 VLC, Quicktime 또는 Windows Media Player와 같은 RTSP 클라이언트로 읽을 수있는 출력 스트림을 선택할 수 있습니다.

+0

이 대답은 해당 질문에 대한 효율적인 솔루션을 제공하기 때문에이 대답에 동의라고 표시했습니다. 프레임을 비디오 엔코더에 직접 입력하는 것이 실제로 PNG 파일을 디스크에 출력하는 것보다 효율적입니다. ffmpeg로 라이브 인코딩을하는 것은 쉽지 않을 수도 있지만 라이브 입력 스트림을 듣기 위해 ffmpeg 용 프로그램을 작성하려고합니다. 라이브 입력 스트림을 수신하고 이러한 입력 스트림을 자동으로 인코딩하는 ffmpeg 서버 프로그램을 작성하는 데 사용할 수있는 C++ 예제가 있습니까? 또는 대안으로, 이미지의 프레임을 Red5 서버에 RTMP 스트림으로 직접 보낼 수 있습니까? –

+0

@all_by_grace 아마도 ffmpeg에 다소 복잡한 명령 행을 쓰지 않고도이 작업을 수행 할 수 있습니다. GL 프로그램에서 "YUV4MPEG2"형식의 프레임을 stdout (또는 다른 파이프)에 쓸 수 있다면 다음과 같은 명령 줄을 사용하여 비디오를 인코딩하고 Red5 서버로 보낼 수 있습니다. ffmpeg -f yuv4mpegpipe -i pipe : 0 - vcodec libx264 -vpre normal -f flv rtmp : // localhost/live/testStream 다음은 프레임 형식에 대한 링크입니다. http://kylecordes.com/2007/pipe-ffmpeg – vipw

0

대부분의 라이브 비디오는 RTMP (플래시) 또는 HLS (Apple)로 포장 된 내부적으로 MPEG2입니다. OpenGL을 프레임으로 렌더링하고 라이브 스트림으로 MPEG2로 변환하는 방법이있을 수 있습니다. 그러나 정확히 어떻게 (아마 FFMPEG?) 모르겠습니다. 일단 완료되면 스트림을 Flash Media Live Encoder (무료)를 통해 푸시하고 RTMP를 사용하여 플래시 클라이언트에 직접 스트리밍하거나 Wowza Media Server로 푸시하여 Flash, Http Live Streaming (Cupertino), Smooth 용으로 패키지 할 수 있습니다 Silverlight 용 스트리밍.

기본적으로 COTS 솔루션을 파이프 라인에 함께 엮어서 소켓과 저수준 물건을 직접 처리하지 않고 표준 플레이어에서 재생할 수 있습니다.

+0

나는 이미 OpenGL 프로그램에서 PNG 이미지 프레임을 생성 할 수 있었고 이것은 연속 이미지 프레임이 될 것입니다. Flash Media 사용 라이브 인코더는 Flash Media 라이브 인코더 소프트웨어를 통해 수동으로 이미지 프레임을 푸시해야한다는 의미입니까? 내 주요한 문제는 응용 프로그램이 실행되는 한 OpenGL 응용 프로그램이 새로운 png 이미지 파일을 계속 생성한다는 것입니다. 이러한 파일을 자동으로 비디오 스트림으로 변환해야합니다.이 파일을 수동으로 삽입하지 않고 웹에 표시해야합니다. 브라우저를 라이브 스트리밍으로 설정합니다 (응용 프로그램을 중지 할 때까지). 프로그래밍 방식으로 할 수 있습니까? –

+0

그게 전부입니다 - 프레임 -> mpeg pocess 일괄 처리 솔루션을 찾는. 알맞은 프레임 속도로 PNG를 디스크에 기록하는 것은 비용이 많이 들기 때문에 메모리에서 수행하는 것이 좋습니다. 나는 그 모든 단계의 다운 스트림에 대한 경험을 가지고있다. 그러나 당신은 아마 정확히 그것을 할 인코더를 발견 할 수 있고, PNG를 입력으로 받아 들여 라이브 MPEG로 스트링 할 수있다. mpeg 라이브러리를 찾고 서비스를 작성하면 될 것입니다. – PTiddy

+0

Wowza는 비슷한 일을하는 몇 가지 게시물을 가지고 있습니다. 그들은 Eclipse 플러그인을 가지고 있으며 개발이 쉽습니다. HTTP 라이브 스트림의 경우 즉시 플리리스트 및 세그먼트를 작성할 수 있습니다. 그것과 HTTP Live Cupertino Streaming 프로토콜은 올바른 방향으로 향하게 할 것입니다. http://www.wowza.com/forums/content.php?145 – PTiddy