2012-12-13 3 views
8

iPhone에서 HTTP 라이브 스트리밍 서버를 실행하려고합니다.이 서버는 카메라에서 비디오 스트림을 캡처하여 HTML5 클라이언트 (HTTP 라이브 스트리밍을 지원함)에 제공합니다.iPhone에서 HTTP 라이브 스트리밍 서버

지금까지 다음과 같은 작업을 수행했습니다. 동적 는 전송 스트림 (비디오/MP2T) 비디오 캡처 모듈에 의해 생성 된 파일 목록에서 인덱스 파일을 갱신 (Node.js를 작성) iOS에서

  1. HTTP 라이브 스트리밍 서버.
  2. AVCaptureMovieFileOutput을 사용하여 일련의 10 초 QuickTime 파일을 연속적으로 생성하는 비디오 캡처 모듈 ( 사이에는 약간의 간격이 있지만 응용 프로그램에는 충분히 작음).

어떤 I 필요한 것은 두 모듈 위의 다리, (I 단지 다른 용기를 필요로 인코딩을 변경할 필요) 전송 스트림 파일에 각 퀵타임 파일을 변환하는 즉석 컨버터이다.

이 방법은 iPhone의 하드웨어 비디오 인코더를 최대한 활용할 수있는 유일한 방법이기 때문에이 방법을 사용하고 있습니다. (저는이 주제에 대한 상당한 연구를 해왔으며 99 % 확실합니다. . 내가 틀렸다면 알려주십시오.)

몇 사람이 ffmpeg를 제안했지만, MIT 라이센스 (있는 경우)를 사용하여 훨씬 더 작은 코드를 사용하거나 처음부터 무언가를 작성하고 (오픈 소스 MIT 라이센스).

저는 미디어 컨테이너에 상당히 익숙합니다. 누군가가 올바른 방향 (샘플 코드, 오픈 소스, 문서 등)을 가르쳐 주시면 정말 감사하겠습니다.

+0

어떻게 완료되었는지 ffmpeg 코드를 볼 수 있습니다. – vipw

+0

ffmpeg가 유일한 저렴한 솔루션이지만 상용 엔코더가 있지만 많은 비용이 듭니다. HLS는 약간의 문제가있을 것입니다. 아마도 rtmp를 고려했을 것입니다. 내가 당신이 avassetwriter에서 생성하는 완전한 mov 파일을 다시 읽을 필요가 있기 때문에 그 차이가 있다고 가정합니다. –

답변

6

나는 이것을 애플 개발자 포럼에 올렸고, 활발한 토론을 펼쳤다. 이것은 비슷한 개념을 제기 한 사람의 대답이었습니다. 내가 생각

는 만약 내가 잘못 정정 해줘, 우리에게 당신이 AVCaptureVideoDataOutput에서 얻을 원시 H264에서의 MPEG TS를 만드는 것은 당신이 x264 또는 유사한 것을 사용하여 트랜스 코딩하지 않는 한 쉬운 일이 아니라고 동의 방법 경우 예를 들어 줄 . 잠깐 동안 mpeg 파일을 쉽게 얻을 수 있다고 가정하면 m3u8 컨테이너에서 파일을 컴파일하고 작은 웹 서버를 시작하고 서비스하는 간단한 문제 일 것입니다. 지금까지 내가 아는 한, 많은 애플 리케이션이 그것을 할, 로컬 호스트 터널을 사용하여 장치에서 거부 문제가되지 않습니다. 어쩌면 어떻게 든 장치에서 hls을 생성 할 수있는 성능에 대해 질문합니다.

등등, JSON 또는 소켓을 열고 서버로 보낼 bencode처럼 난해한 아마도 뭔가를 여전히 AvCaptureVideoDataOutput를 사용하여 기술 번호 2 , 당신은, 프레임을 캡처 일부 깔끔한 작은 프로토콜을 포장. Ahh ... Wi-Fi를 통한 압축되지 않은 프레임 전송에도 대역폭이 필요하기 때문에 좋은 행운을 빕니다. 기술 번호 등

3.

당신은 avassetwriter을 사용하여 새 영화를 작성하고 표준 C 함수를 사용하여 다시 임시 파일에서 읽기,이 괜찮습니다하지만 당신이 가진 것은 원시 H264되면, MP4이 완료되지 않았습니다 따라서 moov 원자가 없으므로 이제 재미있는 부분이이 헤더를 다시 생성합니다. 행운을 빕니다.그래서에

실제로 우리는 인스턴스화 avassetwriters는 한 번만 사용할 수 있습니다 후, 우리는 시작부터 우리는 그들이 GCD의 dispatch_queue를 사용하여 관리하고, 하나가 아닌 2 avassetwriters을 만드는 몇 가지 장점을

을 갖고있는 것 같아요 그 4 tecnique하기 타이머에 처음으로, 미리 결정된 기간이 10 초 후에 우리는 첫 번째 것을 찢어 두 번째로 시작합니다. 이제 완전한 moov 원자를 가진 일련의 .mov 파일이 있습니다. 각각의 압축 된 h264 비디오가 들어 있습니다. 이제 이들을 서버로 보내고 하나의 완전한 비디오 스트림으로 어셈블 할 수 있습니다. 또는 mov 파일을 가져와 librtmp를 사용하여 rtmp 프로토콜로 래핑하고 미디어 서버로 보내는 간단한 스 트리머를 사용할 수 있습니다.

우리는 각각의 개별 mov 파일을 장치 통신으로 장치를 가져 오는 대신 다른 장치로 전송할 수 있습니까? 그 질문은 여러 번 잘못 해석되어 wifi를 통해 동일한 서브넷에있는 다른 아이폰 장치를 찾는 것이 매우 쉽고 완료 될 수 있습니다. tcp over celluar 연결에 다른 장치를 배치하는 것은 거의 불가능합니다. 주소 지정 가능 IP를 사용하는 셀 네트워크에서만 가능하며 모든 일반 통신사에서 가능하지는 않습니다.

는 avfoundation 비디오 플레이어의 비는 많은 다른 별도의 동영상 파일 간의 전환을 처리 할 수 ​​있기 때문에 다음 추가 문제가, 당신은 수 있다고 말한다. 아마도 ffmpeg 디코딩을 기반으로 자신의 스트리밍 플레이어를 작성해야 할 것입니다. (그게 잘 작동하지 않습니다)

+0

대단한 요약 해 주셔서 감사합니다, Michelle. 나는 "테크닉 4"에 매우 가깝다. 이제 해당 세그먼트 경계에서 비디오가 부드럽게 나타납니다. 나는 그 경계를 넘나 드는 소리의 작은 틈새를 아직도 듣고 그것을 없애는 방법을 찾으려하고있다. –

+0

하지만 iPhone 카메라에서 AVAssetWriter를 어떻게 사용합니까? AVCaptureSession을 사용하여 카메라를 사용하는 것에 대해 들어 본 적이 있으며 AVAssetWriter에서 사용할 수 없습니다. – sudo

+0

예, 실제로는 캡처 세션을 설정할 수 있습니다. –

관련 문제