Transcoding auf Handy, Tablet mit Tvheadend Raspberry 4 läuft endlich

  • So habe ich es gemacht:

    - frisches Raspberry OS aufgesetzt
    - Tvheadend mit dieser Anleitung installiert
    - In TVH folgenden User angelegt (damit auf dem Tablet mit VLC ohne Password gestreamt werden kann)
    - In TVH ein neues Streaming Profil "MPEG-TS Spawn/built-in" angelegt.

    - Die Command line unter Spawn settings lautet:

    /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -vf scale=640:360 -vcodec h264_v4l2m2m -vb 1028k -bufsize 2048k -g 100 -af "aresample=async=1:first_pts=0" -acodec mp3 -ab 128k -f mpegts pipe:1

    - TVHClient und VLCPlayer aus dem Playstore runtergeladen und eingerichtet.

    - Bei TVHClient unter Einstellungen -> Profile -> Wiedergebeprofile "ffmpeg" ausgewählt. Voila


    Habe die ursprüngliche Command line aus dem LE Forum angepasst. Mit dem -vb Parameter kann man ein bisschen experimentiern (hab`s verdoppelt).
    Gutes Bild.

    CPU Raspberry:

    Tagesschau. Bei Fussball schwankt die CPu zwischen 40-50%

    Bin sehr zufrieden. Anfangs ruckelt es kurz, danach läuft es sauber durch.

  • Vielen Dank!

    Hab es glatt mal probieren müssen, leider ohne Erfolg.


    Edit:
    TVHeadEnd läuft bei mir im Unraid im Docker "linuxserver/tvheadend:latest"
    Da geht der vcodec natürlich nicht :D

    hab einfach -vcodec h264 anstelle von -vcodec h264_v4l2m2m genommen...
    und noch ein -vaapi_device /dev/dri/renderD128 nach dem vcodec dran gehängt...
    also -vcodec h264 -vaapi_device /dev/dri/renderD128

  • Die Lösung funktioniert gut, wenn auch leider nur für Clients, die kein HTSP nutzen. Das Kodi-TVH-Plugin z.B. kann "MPEG-TS Spawn/built-in" -Profile nicht nutzen.

    Ffmpeg wählt standardmäßig den ersten Video- und den ersten Audio-Stream (den nullten um genau zu sein). Da ich vieles lieber im O-Ton schaue, habe ich -map 0 ergänzt, was dazu führt, dass alles Video-, Audio- und Subtitle-Streams übernommen werden:
    /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -map 0 -vf scale=1280:-1 -vcodec h264_v4l2m2m -vb 5000k -bufsize 5000k -g 100 -af "aresample=async=1:first_pts=0" -acodec mp3 -ab 128k -f mpegts pipe:1

    Da dies nicht funktionierte, habe ich das Audio-Transcoding rausgenommen. Der Gedanke dahinter war, dass das Transcoding für mehr als einen Audio-Stream Probleme machen könnte:
    /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -map 0 -vf scale=1280:-1 -vcodec h264_v4l2m2m -vb 5000k -bufsize 5000k -g 100 -acodec copy -f mpegts pipe:1

    So funktioniert es dann manchmal, aber meistens nicht. Vielleicht muss ich mich mal damit auseinandersetzen, was man aus dem FFMPEG-Log herauslesen kann, wenn man das Log-Level ändert.

    Hat vielleicht bereits jemand Erfahrungen mit dem Thema mehrere Tonspuren?

    EDIT:
    Ich merke gerade auch, dass der Stream schnell asynchron wird. Hängt vermutlich mit der gestrichenen Option -af "aresample=async=1:first_pts=0" zusammen (?)

    EDIT 2:
    /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -map 0:v:0 -map 0:a:0 -map 0:a:1? -vf scale=1280:-1 -vcodec h264_v4l2m2m -vb 5000k -bufsize 5000k -g 100 -acodec mp3 -ab 128k -f mpegts pipe:1
    scheint zu funktionieren. Jetzt bin ich mir noch nicht sicher, wie ich es hinbekomme, dass der Audiofilter auf alle Tonspuren angewendet wird: -af "aresample=async=1:first_pts=0"
    Ihn einfach so drin zu lassen funktioniert nicht.

    EDIT 3:
    /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -map 0:v:0 -map 0:a:0 -map 0:a:1? -vf scale=1280:-1 -vcodec h264_v4l2m2m -vb 5000k -bufsize 5000k -g 100 -filter_complex "[0:a:0]aresample=async=1:first_pts=0;[0:a:1]aresample=async=1:first_pts=0" -acodec mp3 -ab 128k -f mpegts pipe:1
    Hier werden die ersten beiden audio Tracks genommen und beide wie bei OP gefiltert. Wenn es nur einen Audiotrack gibt, funktioniert es leider nicht. Beim Mappen der Streams gibt es noch keinen Fehler, da das "?" nach
    -map 0:a:1? den Fall, dass es keinen zweiten Track gibt, abfängt. Aber der komplexe Filter braucht einen zweiten Track.

    EDIT 4:
    Die Fallunterscheidung, ob ein TS eine oder mehrere Tonspuren hat und somit ein oder mehrere (bzw. zwei, da mich nur die ersten beiden Audiotracks interessieren) Audio-Streams gefiltert werden müssen, ist mir leider nur mit einem kleinen Shell-Script gelungen, das den Stream mittels ffprobe analysiert und so die Tonspuren zählt:

    Bash
    #!/bin/bash
    p="pipe:0"
    n="$(ffprobe -v error -select_streams a -show_entries stream=index -of csv=p=0 "$p" | wc -w)"
    if [ $n == 2 ]
    then
       /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -map 0:v:0 -map 0:a:0 -map 0:a:1? -vf scale=1280:-1 -vcodec h264_v4l2m2m -vb 5000k -bufsize 5000k -g 100 -filter_complex "[0:a:0]aresample=async=1:first_pts=0" -acodec mp3 -ab 128k -f mpegts pipe:1
    else
       /usr/bin/ffmpeg -loglevel quiet -i pipe:0 -map 0:v:0 -map 0:a:0 -map 0:a:1? -vf scale=1280:-1 -vcodec h264_v4l2m2m -vb 5000k -bufsize 5000k -g 100 -filter_complex "[0:a:0]aresample=async=1:first_pts=0;[0:a:1]aresample=async=1:first_pts=0" -acodec mp3 -ab 128k -f mpegts pipe:1
    fi

    Komischerweise zählt ffprobe die Audio- (und Video) -Tracks im TS irgendwie doppelt, daher "$n == 2" statt "$n == 1". Mit nem x264 mkv-file zählt es "richtig".
    So ganz glücklich bin ich mit der Lösung nicht da das Skript den Start eines Streams ganz schön verzögert.

  • also bei mir funzt das alles nicht.. ich habe tvh 4.3 mit lokalen TV Karten.. was genau ist pipe:0? ist das der Stream von der TV karte ? Und pipe:1 ist ja dann wohl der Stream der zum User gesendet wird..

    aber bei mir kommt immer: pass: Unable to start pipe 'pipe:///usr/local/bin/ffmpeg*********************** (wrong executable?)

  • also bei mir funzt das alles nicht.. ich habe tvh 4.3 mit lokalen TV Karten.. was genau ist pipe:0? ist das der Stream von der TV karte ? Und pipe:1 ist ja dann wohl der Stream der zum User gesendet wird..

    aber bei mir kommt immer: pass: Unable to start pipe 'pipe:///usr/local/bin/ffmpeg*********************** (wrong executable?)

    ffmpeg ist ein tool zum transcoden von von Audio und Video Streams um den Stream zum Beispiel von Deinem TVH durch die DSL Leitung (meist geringer Upload) zum Endgerät zu streamen.

    Dazu muss ffmpeg auch installiert sein.
    Unter den bekannten Linux Distris kann man das per console eben schnell nach installieren.

    Spoiler anzeigen

    apt-get update && apt-get install ffmpeg

    Vorraussetzung das man root Rechte besitzt

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!