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
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>
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
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>
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...
... 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./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
Meine Frage: Wie bekomme ich ffmpeg dazu, die Chunks wie beim HLS zu "wrappen" ?