HTTP Live-Streaming-Server auf dem iPhone

8

Ich versuche, einen HTTP-Live-Streaming-Server auf dem iPhone laufen zu lassen, der den Videostream von der Kamera erfasst und an den HTML5-Client (der HTTP-Live-Streaming unterstützt) füttert.

Bis jetzt habe ich folgende Arbeit.

  1. HTTP Live-Streaming-Server auf iOS (in Node.js geschrieben), die dynamisch Aktualisiert die Indexdatei aus der Liste der Transport Streams (Video / MP2T), die vom Video Capture-Modul generiert wurden.
  2. Video-Capture-Modul, das AVCaptureMovieFileOutput verwendet, um eine Serie von 10-Sekunden-QuickTime-Dateien kontinuierlich (es gibt eine kleine Lücke zwischen sie, aber es ist klein genug für meine Bewerbung).

Was ich brauche, ist ein On-The-Fly-Konverter, der jede QuickTime-Datei in eine Transport-Stream-Datei umwandelt (die Codierung muss nicht geändert werden, ich brauche nur einen anderen Container), der zwei Module überbrückt.

Ich gehe von diesem Ansatz aus, da dies der einzige Weg ist, den Hardware-Videoencoder des iPhone auszunutzen, soweit ich weiß (ich habe hier zu diesem Thema ziemlich viel recherchiert und bin mir zu 99% sicher. Bitte lassen Sie mich wissen, wenn ich falsch liege).

Einige Leute haben vorgeschlagen, ffmpeg, aber ich würde lieber viel kleineren Code mit MIT-Lizenz verwenden (falls vorhanden) oder etwas von Grund auf neu schreiben (und Open-Source mit MIT-Lizenz).

Ich bin ziemlich neu in diesem Mediencontainer, und ich würde es sehr begrüßen, wenn mir jemand in die richtige Richtung zeigen könnte (Beispielcode, Open Source, Dokumente, ...).

    
Satoshi Nakajima 13.12.2012, 01:20
quelle

1 Antwort

6

ich gepostet auf dem Apple-Entwicklerforum, wir an einem lebhaften (entschuldigen Sie das Wortspiel) Diskussion tragen. Dies war die Antwort auf jemanden, der eine ähnliche Idee vorgebracht hat.

Ich denke, korrigieren Sie mich, wenn ich falsch liege, und geben Sie uns ein Beispiel, wenn Sie nicht zustimmen, dass die Erstellung eines mpeg ts aus dem rohen h264, die Sie von AVCaptureVideoDataOutput erhalten, kein ist einfache Aufgabe, es sei denn, Sie transcodieren mit x264 oder etwas ähnliches. Nehmen wir einmal an, Sie könnten einfach mpeg ts-Dateien bekommen, dann wäre es eine einfache Sache, sie in einem m3u8-Container zu kompilieren, einen kleinen Webserver zu starten und sie zu bedienen. Soweit ich weiß, und es gibt viele, viele Anwendungen, die es tun, localhost Tunnel aus dem Gerät verwenden kein Problem ablehnen. Also vielleicht könntest du aus dem Gerät H1 generieren, ich frage die Leistung, die du bekommen würdest.

Also weiter zu Technik Nummer 2 Immer noch mit AvCaptureVideoDataOutput, Sie erfassen die Frames, wickeln sie in ein paar nette kleine Protokoll, JSON oder vielleicht etwas esoterischer wie Bencode öffnen Sie einen Socket und senden Sie sie an Ihren Server. Ahh ... viel Glück besser haben ein schönes robustes Netzwerk, da das Senden unkomprimierter Rahmen auch über Wi-Fi wird Bandbreite erforderlich ist.

Also weiter zu Technik Nummer 3.

Sie schreiben einen neuen Film mit Avassetwriter und lesen aus der Temp-Datei mit Standard-C-Funktionen, das ist in Ordnung, aber was Sie haben, ist roh h264, der mp4 ist nicht vollständig, so dass es keine Moov Atome hat, jetzt kommt die Spaßteil, der diesen Titel regeneriert. Viel Glück.

auf So 4 bis tecnique, dass einigen Verdienst tatsächlich zu haben scheint,

Wir erstellen nicht einen, sondern zwei Avassetwriter, wir verwalten sie mit einer gcd dispatch_queue, da Avassetwriter nach Instanziierung nur einmal verwendet werden können, wir starten den ersten auf einem Timer, nach einer vorbestimmten Zeit von 10 Sekunden die zweite, während sie die erste niederreißt. Jetzt haben wir eine Reihe von .mov-Dateien mit vollständigen MOOV-Atomen, von denen jedes komprimiertes h264-Video enthält. Jetzt können wir diese an den Server senden und sie zu einem kompletten Videostream zusammenstellen. Alternativ könnten wir einen einfachen Streamer verwenden, der die mov-Dateien aufnimmt und sie im rtmp-Protokoll mit librmp umschließt und sie an einen Medienserver sendet.

Könnten wir einfach jede einzelne mov-Datei an ein anderes Apple-Gerät senden und so die Geräte-zu-Gerät-Kommunikation erhalten, diese Frage wurde viele Male falsch interpretiert, ein anderes iPhone-Gerät im selben Subnetz über WLAN zu finden ist ziemlich einfach und könnte getan werden. Ein anderes Gerät über TCP-Verbindung über TCP zu lokalisieren ist fast magisch. Wenn es möglich ist, ist es nur in Zellennetzwerken möglich, die adressierbare IPs verwenden und nicht alle gängigen Träger.

Sagen Sie könnten, dann haben Sie ein zusätzliches Problem, da nicht der AVFoundation Video-Player in der Lage, den Übergang zwischen so vielen verschiedenen separaten Filmdateien zu handhaben. Sie müssten Ihren eigenen Streaming-Player schreiben, der wahrscheinlich auf der ffmpeg-Decodierung basiert. (Das funktioniert ziemlich gut)

    
Michelle Cannon 15.12.2012 03:35
quelle