Live Streaming mit HTML5, ffmpeg und DASH

Sound, Digitalkameras, TV+Video und Spiele.
Antworten
ralfi
Beiträge: 285
Registriert: 02.06.2011 11:16:11
Wohnort: Brandenburg

Live Streaming mit HTML5, ffmpeg und DASH

Beitrag von ralfi » 01.06.2018 15:52:55

Hallo liebe Debianer allesamt,

ich hab in der letzten Zeit ein bisschen mit ffmpeg rumgespielt und versucht, einen vom VDR über das Streamdev-Server-Plugin gelieferten HD Transport-Stream direkt mit Hilfe von ffmpeg so zu verarbeiten, dass eine ziemliche simple HTML-Seite diesen Stream im Browser zur Verfügung stellt. Das geht soweit easy, wenn man HLS (HTTP Live Streaming) mit ffmpeg benutzt.

Also z.B. bei mir so ...

TS Stream vom VDR abgreifen, konvertieren und im Apache dynamisch ablegen lassen. VLC oder Webseite mit HTML 5 Video Tag und in Github verfügbarer Javascript Bibliothek (hls.js@canary) obendrauf kann das super abspielen. Der Parameter "hls_wrap" sorgt dafür, dass nur insgesamt 5 Segmente erstellt werden und ab Nummer 6 das Ganze wieder mit dem neuen ersten Segment losgeht. Funktioniert sehr gut und ermöglicht wunderbares kontinuierliches Streaming.

FFMPEG Syntax

Code: Alles auswählen

ffmpeg -nostats -i http://localhost:3000/C-61441-10009-10331.ts -c:v libx264 -vf scale=w=800:h=450 -map 0:0 -crf 24 -c:a aac -map 0:1 -hls_wrap 6 -hls_segment_filename /var/www/html/phoenix_%03d.ts /var/www/html/phoenix.m3u8
Die dazu passende HTML-Seite:

Code: Alles auswählen

<html>
    <head>
	<title>Phoenix Live Stream</title>
    </head>

    <body>
	<script src="hls.js@canary"></script>

	<center>
	<h2>Phoenix Live Stream</h2>
	<video id="video" controls autoplay="false""></video>
	</center>

	<script>
	    var video = document.getElementById('video');
	    if(Hls.isSupported()) {
	    var hls = new Hls();
	    hls.loadSource('http://localhost/phoenix.m3u8');
	    hls.attachMedia(video);
	    hls.on(Hls.Events.MANIFEST_PARSED,function() {
	      video.play();
	  });
	 }
	  else if (video.canPlayType('application/vnd.apple.mpegurl')) {
	    video.src = 'http://localhost/phoenix.m3u8';
	    video.addEventListener('loadedmetadata',function() {
	      video.play();
	    });
	  }
	</script>

    </body>
</html>
Nachdem das wunderbar funktioniert hat, wollte ich das Problem mit Hilfe des ffmpeg DASH Muxers lösen. Da kann man adaptives Streaming mit unterschiedlichen Bitraten (soll später kommen, ist hier noch nicht das Problem ...) realisieren. Geht auch gut, ALLERDINGS werden hier die Teilsegmente nicht gelöscht und müllen den Pfad zu.

FFMPEG Syntax

Code: Alles auswählen

ffmpeg -re -i http://localhost:3000/T-8468-259-772.ts -c:v libx264 -vf scale=w=800:h=-1 -crf 22 -map 0:0 -c:a aac -map 0:1 -flags +global_header -remove_at_exit 1 -f dash /var/www/html/test.mpd
Dazu die passende HTML-Seite:

Code: Alles auswählen

<html>

    <head>
	<title>Live Stream</title>
    </head>

    <body>

	<script src="dash.all.min.js"></script>

	<center>
	<h4>FFMPEG Live DASH Stream</h4>
	</center>

    <body>

	<style>	video { width: 1280px; height: 720px; }</style>

	<center>
	    <div>
		<video data-dashjs-player autoplay src="test.mpd" controls></video>
	    </div>
	</center>

    </body>

    </body>
</html>
Hier sorgt die dash.all.min.js Bibliothek dafür, dass der Stream richtig dargestellt wird.

Im Pfad vom Apache werden hier die Manifest-Datei (test.mpd), die Initial-Stream-Files init-stream0.m4s und init-stream1.m4s sowie die Video- und Audio-Chunks (Teilsegmente) abgelegt. Das Streaming klappt auch hier ohne Probleme, ALLERDINGS habe ich ums Verrecken keinen Parameter gefunden, welcher wie beim HLS Streaming das "Wrapping" der Segmente ermöglicht. Die Folge ist, dass alles mit den Chunks "zugemüllt" wird...
/var/www/html/chunk-stream0-00213.m4s /var/www/html/chunk-stream0-00457.m4s /var/www/html/chunk-stream1-00094.m4s /var/www/html/chunk-stream1-00338.m4s /var/www/html/chunk-stream1-00582.m4s
/var/www/html/chunk-stream0-00214.m4s /var/www/html/chunk-stream0-00458.m4s /var/www/html/chunk-stream1-00095.m4s /var/www/html/chunk-stream1-00339.m4s /var/www/html/chunk-stream1-00583.m4s
/var/www/html/chunk-stream0-00215.m4s /var/www/html/chunk-stream0-00459.m4s /var/www/html/chunk-stream1-00096.m4s /var/www/html/chunk-stream1-00340.m4s /var/www/html/chunk-stream1-00584.m4s
/var/www/html/chunk-stream0-00216.m4s /var/www/html/chunk-stream0-00460.m4s /var/www/html/chunk-stream1-00097.m4s /var/www/html/chunk-stream1-00341.m4s /var/www/html/chunk-stream1-00585.m4s
/var/www/html/chunk-stream0-00217.m4s /var/www/html/chunk-stream0-00461.m4s /var/www/html/chunk-stream1-00098.m4s /var/www/html/chunk-stream1-00342.m4s /var/www/html/chunk-stream1-00586.m4s
/var/www/html/chunk-stream0-00218.m4s /var/www/html/chunk-stream0-00462.m4s /var/www/html/chunk-stream1-00099.m4s /var/www/html/chunk-stream1-00343.m4s /var/www/html/chunk-stream1-00587.m4s
... und so weiter. Zwar löscht der ffmpeg Parameter "remove_at_exit 1" alle Chunk Files. Aber natürlich erst dann, wenn ich die Konvertierung bzw. den Stream abbreche oder beende.

Meine Frage: Wie bekomme ich ffmpeg dazu, die Chunks wie beim HLS zu "wrappen" ?
Viele Grüße, ralfi

Niveau sieht von unten oft wie Arroganz aus ...

ralfi
Beiträge: 285
Registriert: 02.06.2011 11:16:11
Wohnort: Brandenburg

Re: Live Streaming mit HTML5, ffmpeg und DASH

Beitrag von ralfi » 04.06.2018 09:37:38

Na zumindest mal vielen Dank an diejenigen, welche das hier gelesen haben ...

Da ist es wieder, eines meiner vielen Probleme...
Entweder ist die Lösung der Frage so simpel dass hier keiner antwortet weil ich die Manpage nicht gelesen habe ODER aber sie ist so kompliziert, dass keiner eine Antwort hat.
Viele Grüße, ralfi

Niveau sieht von unten oft wie Arroganz aus ...

ralfi
Beiträge: 285
Registriert: 02.06.2011 11:16:11
Wohnort: Brandenburg

Re: Live Streaming mit HTML5, ffmpeg und DASH

Beitrag von ralfi » 04.06.2018 15:57:00

Ich habe das Problem nun selbst lösen können. Die Lösung besteht darin, in den Parametern der Kommandozeile explizit die dieses Verhalten steuernden Paratmeter "use_template", "window_size" und "remove_at_exit" anzugeben. So funktioniert es einwandfrei...

Code: Alles auswählen

ffmpeg -ss 3 -re -i http://localhost:3000/T-8468-61697-771.ts -c:v libx264 -vf scale=w=1280:h=-1 -crf 26 -map 0:0 -c:a aac -map 0:1 -keyint_min 200 -g 200 -use_template 1 -window_size 3 -remove_at_exit 1 -streaming 1 -use_timeline 1 -f dash /var/www/html/test.mpd
Viele Grüße, ralfi

Niveau sieht von unten oft wie Arroganz aus ...

Benutzeravatar
Tintom
Moderator
Beiträge: 3029
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Live Streaming mit HTML5, ffmpeg und DASH

Beitrag von Tintom » 04.06.2018 20:56:46

Entweder hab ich das Problem nicht verstanden, oder du suchst so etwas wie tvheadend (leider noch nicht in den offiziellen Repos).

ralfi
Beiträge: 285
Registriert: 02.06.2011 11:16:11
Wohnort: Brandenburg

Re: Live Streaming mit HTML5, ffmpeg und DASH

Beitrag von ralfi » 05.06.2018 14:09:19

Naja, weiss nicht so genau ob das tvheadend so kann.

Ich möchte möglichst einfach die Möglichkeit anbieten, Live TV für mehrere Nutzer im LAN im Browserfenster mit guter Qualität und niedriger Bitrate aus einer DVB-T/C-Quelle als HTML 5 Stream (d.h. ohne Flash oder solchen Müll) anzusehen. Aber das Problem ist ja nun erstmal gelöst.
Viele Grüße, ralfi

Niveau sieht von unten oft wie Arroganz aus ...

ralfi
Beiträge: 285
Registriert: 02.06.2011 11:16:11
Wohnort: Brandenburg

Re: Live Streaming mit HTML5, ffmpeg und DASH

Beitrag von ralfi » 21.06.2018 15:23:08

Ja, alles gut. Funktioniert so wie es soll.
Viele Grüße, ralfi

Niveau sieht von unten oft wie Arroganz aus ...

Antworten