2012-10-22 9 views
33

온라인 TV 서비스를 다하고 있습니다. 목표 중 하나는 추가 브라우저 플러그인 (플래시 제외)없이 비디오를 재생하는 것입니다.라이브 스트리밍 (MP4)

대부분의 HTML5 브라우저와 Flash (대체)에서 지원되므로 MP4를 사용하기로 결정했습니다. 비디오는 FFMpeg에 의해 서버의 ASF에서 코드 변환됩니다.

그러나 MP4는 길이를 지정해야하는 메타 데이터 용 moov 원자를 가지고 있기 때문에 실시간 스트리밍 할 수없는 것으로 나타났습니다. FFMpeg는 mp4를 stdout으로 직접 스트리밍 할 수 없습니다. 파일 끝에 moov를 넣기 때문입니다. (Live transcoding and streaming of MP4 works in Android but fails in Flash player with NetStream.Play.FileStructureInvalid error)

물론 MPEG-TS가 있지만 HTML5 <video>에서는 지원되지 않습니다.

내가 MP4로 실시간으로 스트림을 트랜스 코딩하는 방법에 대해 생각한 것이고, 새로운 HTTP 요청이있을 때마다 먼저 비디오의 길이에 대해 매우 긴 숫자를 지정하는 moov를 보낸 다음 전송을 시작합니다 나머지는 MP4 파일입니다.

그런 방식으로 스트리밍 할 때 MP4를 사용할 수 있습니까?

일부 연구 및 av501의 답변을받은 후 프레임의 크기를 알아야 작동 할 수 있음을 이해합니다.

mp4 파일을 스트리밍 할 수 있도록 더 작은 부분으로 분할 할 수 있습니까?

물론 다른 컨테이너/형식으로 전환하는 것도 옵션이지만 Flash 및 HTML5와 호환되는 형식은 mp4/h264뿐이므로 두 가지를 모두 지원해야한다면 두 번 코드 변환해야합니다.

답변

5

여기 내 생각에 사람들 중 일부는 다른 사람에게 맞을 수도 있습니다. 아무도이 과정을 완전히 문서화하지 않았기 때문에 나는 무지를 주장합니다.

AvAssetWriter는 파일로만 인코딩하므로 인코딩 된 비디오를 메모리로 가져올 방법이없는 것 같습니다. 이 파일을 백그라운드 쓰레드에서 쓰는 동안 소켓 스트림이 기본 스트림이된다. 이것은 본질적으로 h464/acc mdata를 가진 컨테이너이지만 moov 아톰은없는 m4v이다. (즉 헤더가 없음) Apple 제공 플레이어가이 스트림을 재생할 수는 없지만 ffplay를 기반으로하는 수정 된 플레이어는 스트림을 디코딩하고 재생할 수 있어야합니다. 이것은 ffplay가 기본 스트림을 디코딩 할 수있는 libavformat를 사용하기 때문에 작동해야합니다. 파일 길이 정보가 없기 때문에 한 가지주의해야 할 점이 있습니다. 몇 가지는 DTS 및 PTS로 결정되어야하며 플레이어는 파일 내에서 탐색 할 수 없습니다.

또는 m4v 스트림의 원시 naul을 사용하여 rtmp 스트림을 구성 할 수 있습니다.

더 궁금한 점이 있으면 저에게 직접 연락하십시오.

데이터를받는 방법.

어쨌든 수신 측에서 파일을 다시 작성해야하므로 세그먼트 분할이 가능할 것이라고 생각합니다. Steve Mcfarin은 자신의 github 페이지에서 찾을 수있는 little appleSegmentedEcorder를 작성했으며 일부 문제를 해결합니다. 당신이 모든 파일 정보를 가지고 있기 때문에 moov 원자.

+1

여기에 rtmp 또는 일부 사용자 지정 프로토콜과 같은 소리가 나기 시작하는 좋은 설명이 있습니다. http://fabiensanglard.net/mobile_progressive_playback/index.php –

+0

답변에주의가 필요합니다. 시간은 스트리밍 및 재생에 대한 문제입니다. 그래서 -1 – agfe2

2

아니요, 매우 긴 길이가 아닙니다. mp4에서 헤더를 만들려면 모든 프레임의 정확한 크기를 알아야합니다. [이것이 결국 다양한 인코더에 의해 생성되는 이유입니다.]

+0

그 정보를 비워 둘 수 없습니까? 몇 가지 조정을 한 후 moov 원자가없는 m4v 파일 (기본적으로 MP4)을 만들었으며 비디오 길이에 대한 정보는 표시하지 않고 Totem에서 재생했습니다. – Ivo

+0

m4v는 기본 파일 또는 기본 파일이 들어있는 mp4 (컨테이너)입니까? 헤더가 없으면 더 이상 준수하지 않습니다. 따라서 그것이 재생되는지 여부는 플레이어가 얼마나 지능적인지에 달려 있습니다. 일부 플레이어는 열심히 노력하여 파일을 수정하려고합니다. 그러나 대부분은 그것을하지 않을 것입니다. – av501

+0

예, m4v는 mp4 파일이거나 원시 h264 스트림 일 수 있습니다. 브라우저에서 작동했던 것들은 mp4이고, ffmpeg에 의해 생성 된 것은 원시 스트림이었습니다. 결국 그것은 할 수없는 것처럼 보입니다. – Ivo

0

"동영상은 서버의 ASF에서 ffmpeg로 트랜스 코드됩니다."라는 질문의 두 번째 항목을 보면 서버에서 동영상을 트랜스 코딩하기 위해 ffmpeg를 사용한다고 언급했습니다.

qt-faststart 또는 MP4Box를 사용하여 파일의 시작 부분에 MOOV 아톰을 배치하십시오. (또한 범용 지원을 위해 H264 비디오 & AAC 오디오 코덱 사용)

희망이 도움이되었습니다.

+2

그것은 그렇지 않습니다. 수많은 Google 검색 결과 qt-faststart가 많이 언급되었지만 스트리밍 이후 실시간 스트리밍에서는 작동하지 않습니다. 프레임/길이를 처음부터 알 수 없으므로 MOOV 아톰을 만들 수 없습니다. qt-faststart는 pseudostreaming (연속 다운로드)이 필요한 경우 도움이됩니다. – Ivo

17

조각난 MP4를 사용할 수 있습니다. 조각난 MP4 파일은 다음과 내장되어 있습니다 :

moov [moof mdat]+ 

MOOV 상자 만 트랙에 대한 기본 정보 (얼마나 많은 자신의 종류, 코덱 초기화 등)하지만, 트랙의 샘플에 대한 정보가 포함되어 있습니다. 샘플 위치 및 샘플 크기에 대한 정보는 moof 상자에 있으며, 각 moof 상자 뒤에는 앞의 moff 상자에 설명 된 샘플이 들어있는 mdat가옵니다. 일반적으로 (moof, mdat) - 쌍의 길이를 약 2,4 초로 선택합니다 (이에 대한 사양은 없지만 이러한 값은 대부분의 유스 케이스에서 합리적으로 보입니다).

이것은 네거티브 MP4 스트림을 구성하는 방법입니다.

+0

여기를보세요. https://groups.google.com/forum/?fromgroups=#!topic/mp4parser-discussion/e7yg6clATHc이 사람은 매우 비슷한 문제가있는 것 같습니다. –

+3

궁극적으로 단편화 된 mp4는 Apple HTTP 라이브 스트리밍과 같으며 훌륭하게 작동합니다. 나는 조각화가 불필요한 합병증 인 것처럼 보였기 때문에 처음에는 그것을 무시했지만, 이제는 그것이 유일한 선택임을 알았습니다. – Ivo

+0

@SebastianAnnies 그러나 이것은 (적어도) 사파리가 각 조각을 별도의 Range GET 요청 (조각 시작부터 EOF까지, 그러나 조기에 끝내기)을 요청하는 것처럼 보이기 때문에 스트림의 전체 처리가 훨씬 더 불편한 것으로 보입니다. 당신은 같은 경험을 가지고 있습니까? –