Streaming auf iOS/macOS oder anderes -> HLS Stream mit ffmpeg/avconf

  • Moin,


    Ich probiere für meine Plex Lösung weiter rum ... hier ein Schnippel, den ich mir zusammen gesucht habe und mit dem aktuellen avconf (yavdr 0.6.1) klappt es auch prima einen Stream zu genieren, der dann auf dem iPhone bzw. iPad wiedergegeben wird:


    Code
    avconv -y -i "http://video:3000/TS/1" -c:a aac -strict experimental -ac 2 -b:a 96k -ar 44100 -c:v libx264 -pix_fmt yuv420p -profile:v main -level 32 -bufsize 6M -crf 18 -r 24 -g 72 -f hls -hls_time 9 -hls_list_size 10 -hls_wrap 10 -s 1280x720 ts/1280x720.m3u8


    Wobei "http://video:3000" mein VDR und der StreamDev Port sind. Klappt auch mit 1080p material (Sky Cinema HD).


    Evtl. hilft es ja dem einen oder anderen. Sobald ich eine .sh executable habe für Streamdev, poste ich das hier noch.


    Cheers
    J*

    Edited once, last by Jondalar: Optionen im avconv call angepasst auf live streaming und begrenzte Segmente ().

  • H,
    warum nimmst du nicht h. 265?
    MfG Stefan

    Test-VDR1: HP rp5700 Fertigsystem, Core2Duo E6400, 2GB RAM, FF-SD C-2300, nvidia Slim-GT218 x1 | easyVDR 2.0 64Bit
    VDR3: in Rente

    VDR4: MSI G31M2 v2, Digitainer2-Geh., t6963c 6" gLCD, E5200, 2GB, 3TB WD Red, GT730, 2x TT S2-3200; easyVDR 3.5 64bit
    VDR5: Gigabyte
    GA-G31M-S2L, Intel E2140, Zotac GT730 passiv, Digitainer2-Geh., t6963c 6 " gLCD, 2 TB WD Red, 2x TT S2-3200 (an 1 Kabel) easyVDR 3.5 64bit
    VDR6:
    Intel E5200, GT630 passiv, F1 750 GB, t6963c gLCD, 2x TT S2-3200 | easyVDR 3.5 64bit
    VDR-User #1068
    www.easy-vdr.de

  • warum nimmst du nicht h. 265?

    Gute Frage ... hab ich noch gar nicht getestet :) Müsste ich aber mal.. aktuell wollte ich nur die Entdeckung teilen. Wäre ja spannend, ob ein iPhone 6s/AppleTV 4 h265 abspielen können direkt im nativen PlayerView.


    Ich probiere gerade rum damit und bin mir noch nicht sicher, wo ich damit hingehen will... Stand jetzt könnte man damit die Segmenter basierten Lösungen im Unterbau von iVDR und iStreamDev ersetzen denke ich. Also direkt per ffmpeg/avconv die .m3u8 erstellen lassen für den Client.


    Mir schwebt eher vor, mich mit dem RestfulApi als Webserver auseinander zu setzen und ggfs dafür was simples zu bauen. Erstmal nur "tunen" und "streamen", so dass mein iOS Fuhrpark direkt was damit anfangen kann. Evtl. auch im Plex UI weiter, wobei das für mich nur ein Vehikel war damals.


    VG,
    Alex

  • Hi,
    mit i*** bin ich überfragt. Nutze sowas nicht.


    h.265 ist zumindest extrem bandbreiteneffizient. HD Filme auf eine CD zu tun, ist doch ganz ok ;)


    MfG,
    Stefan

    Test-VDR1: HP rp5700 Fertigsystem, Core2Duo E6400, 2GB RAM, FF-SD C-2300, nvidia Slim-GT218 x1 | easyVDR 2.0 64Bit
    VDR3: in Rente

    VDR4: MSI G31M2 v2, Digitainer2-Geh., t6963c 6" gLCD, E5200, 2GB, 3TB WD Red, GT730, 2x TT S2-3200; easyVDR 3.5 64bit
    VDR5: Gigabyte
    GA-G31M-S2L, Intel E2140, Zotac GT730 passiv, Digitainer2-Geh., t6963c 6 " gLCD, 2 TB WD Red, 2x TT S2-3200 (an 1 Kabel) easyVDR 3.5 64bit
    VDR6:
    Intel E5200, GT630 passiv, F1 750 GB, t6963c gLCD, 2x TT S2-3200 | easyVDR 3.5 64bit
    VDR-User #1068
    www.easy-vdr.de

  • Abend,


    mir war auch noch nicht bewusst, dass ffmpeg ein Segmenter integriert hat und außerdem die passende m3u8 erstellen kann,


    Ich habe mal mit folgenden FFMpeg Command einen Stream erstellt und mit Apache ausliefern lassen.

    Code
    ffmpeg -analyzeduration 1M -i "http://127.0.0.1:3000/1.ts" -vcodec libx264 -bufsize 2000k -maxrate 1200k -crf 22 -g 50 -map 0:v -map a:0 -vf "yadif=0:-1:1, scale=640:360" -preset medium -tune film -vprofile main -level 30 -acodec aac -strict -2 -ab 64k -ar 44100 -ac 2 -async 1 -f hls -hls_time 9 -hls_list_size 10 -hls_wrap 10 stream.m3u8




    Und zusammen mit Hannemann's Lösung funktioniert der Stream tadellos unter Chrome (Android/Linux/Windows), Firefox (getestet unter Windows) und dem Microsoft Edge. Der IE11 streikt und ist somit raus :)


    Da ich mich schon eine Weile mit HLS beschäftigt habe, musste ich aber feststellen das HLS leider nicht wirklich für OnDemand-Live-Streaming geeignet ist. D.h. es muss ja erst der Sender getuned werden, dann muss ffmpeg mit dem Umwandeln beginnen und bis dann die ersten Segmente und die M3U8 eintrudeln ist schon eine gewisse Zeit vergangen und da steigen die meisten Clients schon aus. Wenn dieser ganze Vorgang schon läuft und man erst dann auf den Stream zugreift gibt es natürlich keine Probleme.


    Das nächste Problem ist, dass wenn der Client die Verbindung schließt, z.B. wenn der Browser geschlossen wird, dann läuft ffmpeg munter weiter und blockiert weiter den Tuner (und lastet die CPU nicht unerheblich aus). Man könnte natürlich manuell vom Client aus irgend ein Befehl senden, der FFMpeg abschießt, aber das ist unschön. Denn wenn mal die WLAN-Verbindung vom Client zusammenbricht kommt so ein Befehl nicht an und FFMpeg läuft weiter.


    Wenn das ganze dann noch Multi-User tauglich werden soll, wird es noch problematischer. Es muss ja für jeden unterschiedlichen Kanal ein eigener FFMpeg Prozess gestartet werden, d.h. wenn die Segmente und die M3U8 über Standard-Webserver (z.B. Apache) ausgeliefert werden, müssten die alle unterschiedliche Namen bekommen.


    Man braucht also für die Auslieferung der Dateien und der FFMpeg-Überwachung ein speziell für diese Fälle angepassten Webserver .


    Mein XMLAPI Plugin kann das zwar alles, aber zufrieden bin ich da noch lange nicht. Den Segmenter den ich da integriert habe, hab ich nicht selbst entwickelt und ist schon recht alt. Keine Ahnung ob die Segmentierung und die Index-Datei Erstellung 100% Standard-konform ist. Ich denke die FFMpeg Entwickler haben da 1000x mehr Ahnung von, als ich.


    Ich hatte HLS auch nur in das Plugin integriert, weil sich Android weigerte einen Standard-HTTP-TS-Stream (wie ihn z.B. Streamdev liefert) abzuspielen. Da ich dafür aber inzwischen eine Lösung gefunden habe, und ich somit nicht mehr auf das eher ungeeignete HLS-Protokoll angewiesen bin, fliegt zumindest die jetzige Implementierung wieder raus.


    Aber da ich das Thema sehr spannend finde und inzwischen sehr viele Player und Browser (wenn auch teilweise nur mit Hannemanns entdeckter HLS-Javascript-Lösung) mit HLS umgehen können, bin ich gerne dazu bereit etwas zu einer vernünftigen Lösung beizutragen. Frickel-Lösungen gibt es ja schon einige ;)

    Mit Apple Hardware kann ich aber nicht dienen
    :P

    VG
    Karl




  • Hallo Karl,


    ja - deine XML Api bringt schon vieles mit, ich schaue mir das Ding im Moment an. Ich wollte einen nativen Client auf dem AppleTV basteln, nix wildes und nur für den Hausgebrauch erst mal... Dabei habe ich dann (erneut) festgestellt, das der AVPlayer im iOS sich beharrlich weigert was anderes als mp4 abzuspielen, entweder als file oder via hls.


    Irgendwann stiess ich dann darauf, das ffmpeg/avconv ja mittlerweile selber den segmenter integriert hat.


    Da ich mit einer client app auf den Stream zugreifen wollen würde, wäre das kein Problem einen "kill stream" event zu senden.


    Frage - wenn ein http server in dem VDR Plugin wäre, dann könnte man doch checken ob die Segmente noch abgeholt werden... und wenn nicht, dann automatisch den ffmpeg thread beenden und aufräumen.


    Zum Thema speed - da spiele ich schon mit den Optionen und habe es schon deutlich runtergebracht was den CPU Hunger betrifft. Plex ist da ganz gut zum "abgucken" geeignet ;)


    Ich bastel mal weiter vor mich hin und falls was rauskommt zeige ich es hier sicherlich.


    VG,
    Alex

  • Quote

    Frage - wenn ein http server in dem VDR Plugin wäre, dann könnte man doch checken ob die Segmente noch abgeholt werden... und wenn nicht, dann automatisch den ffmpeg thread beenden und aufräumen.

    Ja so ähnlich mache ich das ja in dem Plugin. Ich prüfe allerdings nicht ob noch auf Segmente zugegriffen wird, sondern ob die M3U8 noch abgeholt wird. Auf die wird ja sekündlich oder noch öfter zugegriffen.


    Ich versuche mal die Tage im XMLApi-Plugin ffmpeg die Erzeugung der Index-Datei und der Segmente zu überlassen, statt es selbst zu machen. Vielleicht löst es ja das eine oder andere Problem, dass es da noch gibt.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!