2012-12-13 99 views
8

我試圖在iPhone上運行HTTP實時流媒體服務器,該服務器捕獲來自攝像機的視頻流並將其提供給HTML5客戶端(它支持HTTP實時流式傳輸)。iPhone上的HTTP實時流媒體服務器

到目前爲止,我有以下工作。在iOS

  1. HTTP實時流媒體服務器(用Node.js的),其動態 從傳輸流(視頻/ MP2T)通過視頻採集模塊生成的文件列表更新索引文件。
  2. 視頻採集模塊,它採用AVCaptureMovieFileOutput產生一系列 10秒的QuickTime文件連續的(有 它們之間小的差距,但它足夠小,我的應用程序)。

我需要的是一個即時轉換器,它將每個QuickTime文件轉換爲一個傳輸流文件(無需更改編碼,我只需要一個不同的容器),它橋接了上述兩個模塊。

我正在採取這種方法,因爲這是利用iPhone的硬件視頻編碼器的唯一方法,據我所知(我在這裏做了相當多的關於這個話題的研究,而且我99%確定如果我錯了,請告訴我)。

有人提出ffmpeg,但我寧願使用MIT許可證(如果有的話)使用更小的代碼或從頭開始編寫一些代碼(並且使用MIT許可證開放它的代碼)。

我對這個媒體容器的東西很陌生,如果有人能指出我正確的方向(示例代碼,開源,文檔......),我會非常感激。

+0

你可以看一下FFmpeg的代碼,看看它是如何做。 – vipw

+0

的ffmpeg是唯一的廉價的解決方案,也有商業的編碼器,但他們花費很多錢。在手機上創建HLS將是一個小問題,沒考慮也許RTMP,因爲它似乎你在的地方很多件。我假設這些差距是因爲你需要讀回你從avassetwriter生成的完整的mov文件。 –

回答

6

我發佈在蘋果開發者論壇上,我們進行一場生動的(辯解雙關語)討論。這是對有人提出類似觀點的回答。

我想糾正我,如果我錯了,給我們如何,如果你不同意,建立從原料H264你從AVCaptureVideoDataOutput得到一個MPEG TS不是 容易的事,除非你轉碼使用X264或類似的例子。讓我們假設您可以輕鬆獲得mpeg ts文件,然後在m3u8容器中編譯它們,啓動一個小型web服務器併爲它們服務將是一件簡單的事情。 據我所知,有許多應用程序這樣做,從設備使用本地主機隧道不是拒絕問題。所以也許不知怎的,你可以從設備生成hls,我質疑你會得到的性能。

等方面依然採用AvCaptureVideoDataOutput技術2號 ,你捕捉到的幀,在一些整齊的小包裝協議其中,JSON或者是一些更深奧像bencode打開一個套接字,並將它們發送到服務器。 啊......好運更好有一個很好的健壯的網絡,因爲甚至通過無線網絡發送未壓縮的幀將需要帶寬。

等方面技術的數字3

您使用avassetwriter寫一部新的電影,並使用標準的C函數讀取臨時文件回來了,這是好的,但你有什麼是生H264,MP4的不完整因此它沒有任何moov原子,現在成爲再生這個頭部的有趣部分。祝你好運。

等方面tecnique 4,似乎確實有一些優點

我們不能創造之一,但2 avassetwriters,我們管理他們使用GCD dispatch_queue,因爲經過實例avassetwriters只能使用一次,我們啓動第一個在定時器上,在預定的時間段說10秒後,我們開始第二個,同時撕下第一個。現在我們有一系列完整moov原子的.mov文件,每個文件都包含壓縮的h264視頻。現在我們可以將這些發送到服務器,並將它們組合成一個完整的視頻流。或者我們可以用一個簡單的流光,是以MOV文件,並使用librtmp並將它們發送到媒體服務器包裝他們RTMP協議。

我們是否可以將每個單獨的mov文件發送到另一個蘋果設備,從而獲得設備到設備的通信,這個問題被錯誤地解釋了很多次,通過wifi在同一子網上定位另一個iphone設備非常容易,可以完成。在TCP過的元胞的連接定位另一個設備幾乎是不可思議的,如果這是可以做到的只能在使用IP尋址的,而不是公共承運人做手機網絡。

說你可以,那麼你有一個額外的問題,因爲avfoundation視頻播放器將不能夠處理許多不同的單獨的電影文件之間的轉換。你將不得不根據ffmpeg解碼編寫自己的流媒體播放器。 (那確實工作比較好)

+0

謝謝Michelle的精彩總結。我選擇了一種對「技術4」非常封閉的機制。現在視頻在這些片段邊界上非常流暢。我仍然聽到跨越這些邊界的聲音有微小的差距,並試圖找出如何消除它。 –

+0

但是,您如何使用iPhone攝像頭使用AVAssetWriter?我只聽說用AVCaptureSession使用相機,並且不能將它用於AVAssetWriter。 – sudo

+0

是的,你可以實際上,你仍然設置捕捉會話 –