PHP: Wie kann ich die Videoladezeit verbessern?
Hallo,
ich habe folgendes Problem:
Ich habe diese PHP-Datei erstellt und bei mir auf meinem iPhone lädt es die Videodatei sehr langsam bis gar nicht. Wenn ich aber auf PC im gleichen Netflix schaue, lädt es sehr schnell.
Ich habe es bei anderen Freunden testen lassen, die auch ein iPhone haben. Bei der einen Person lädt es auch sehr schnell, bei der anderen auch nicht, so wie bei mir. Bei mir lädt es immer nur schnell, wenn ich mobile Daten anhabe.
Die Videodateien sind 2-7 GB groß.
Vielleicht kann jemand eine Lösung für mich finden, das zu beheben. Wichtig ist, dass ich die Größe der Videodateien nicht verkleinern kann. Das heißt, es muss trotzdem schnell die Videodatei laden.
Ich sage schon einmal danke an die Person, die sich die Zeit und Mühe nimmt, mir zu helfen.
Bei einer Verbindung mit dem normalen Heimnetz sieht es auf dem iPhone so aus:
Wenn ich über LTE (mobile Daten) lade:
Der PHP-Code:
<?php
require 'db.php'; // Die Datenbankverbindung einbinden
require 'is_premium.php'; // Die Datenbankverbindung einbinden
// Überprüfen, ob eine ID übergeben wurde
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
die('Ungültige Film-ID.');
}
$movie_id = intval($_GET['id']);
// Film aus der Datenbank abfragen
$stmt = $db->prepare('SELECT * FROM movies WHERE id = ?');
$stmt->bind_param('i', $movie_id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
die('Film nicht gefunden.');
}
$movie = $result->fetch_assoc();
$stmt->close();
$db->close();
// Erkennen, ob die URL ein lokales Video ist oder über HTTPS geladen werden soll
$is_local_video = strpos($movie['video'], 'uploads/videos/') === 0;
$is_https = strpos($movie['video'], 'https://') === 0;
$thumbnail = htmlspecialchars($movie['thumbnail']); // Thumbnail aus der Datenbank
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo htmlspecialchars($movie['name']); ?> - MovieVel</title>
<style>
#css code
</style>
</head>
<body>
<div class="container">
<div class="movie-detail">
<h1><?php echo htmlspecialchars($movie['name']); ?></h1>
<!-- Movie Video -->
<div class="<?php echo $is_local_video ? 'video-container' : 'iframe-container'; ?>">
<div class="play-btn">
▶ <!-- Play-Symbol -->
</div>
<?php if ($is_local_video): ?>
<!-- Video für progressive Web-Optimierung mit Bild-in-Bild-Unterstützung -->
<video id="video-player" controls autoplay preload="auto" poster="<?php echo $thumbnail; ?>"
onclick="this.requestPictureInPicture()" muted playsinline>
<source src="<?php echo htmlspecialchars($movie['video']); ?>" type="video/mp4">
Ihr Browser unterstützt dieses Videoformat nicht.
</video>
<?php elseif ($is_https): ?>
<iframe
src="<?php echo htmlspecialchars($movie['video']); ?>"
allowfullscreen>
</iframe>
<?php else: ?>
<p>Video konnte nicht geladen werden. Überprüfen Sie die URL oder die Serverkonfiguration.</p>
<?php endif; ?>
</div>
<!-- Movie Description -->
<div class="description-box">
<h2>Über den Film</h2>
<p><?php echo htmlspecialchars($movie['description']); ?></p>
</div>
<!-- Back Button -->
<a href="index.php" class="back-btn">Zurück zur Übersicht</a>
</div>
</div>
<script>
const video = document.getElementById('video-player');
// Überprüfen, ob Picture-in-Picture unterstützt wird
if ('pictureInPictureEnabled' in document) {
video.addEventListener('click', async () => {
try {
// Versuchen, Bild-in-Bild zu aktivieren
if (document.pictureInPictureElement !== video) {
await video.requestPictureInPicture();
} else {
// Wenn das Video schon im Bild-in-Bild-Modus ist, es wieder schließen
await document.exitPictureInPicture();
}
} catch (err) {
console.error('Fehler beim Wechseln in den Bild-in-Bild-Modus:', err);
}
});
}
</script>
</body>
</html>
2 Antworten
Hi cp46ideal,
das hat indirekt was mit PHP zu tun. Es kommt auf die Ladetechnik an und welches Format man nutzt. Wie GamersGame schon geschrieben hat, nutzen Videostreamdienste wie Netflix und Co. die Technik Segemente des Videos zu laden anstatt das ganze Videomaterial auf einmal. Vorteil dabei ist, dass Videos schnell geladen werden können und man nicht 2 Minuten, 3 Minuten oder länger warten muss bis ein Video geladen ist, sondern oft ad-hoc funktionieren.
Diese Technik nennt man auch Adaptive Bitrate Streaming (ABR) und die Zeitabschnitte nennt man Chunks.
Btw: Diese Technik von Anfang an von Anbieter für Erwachsenenseite intensiv genutzt und diese haben am wesentlichen Weiterentwicklung mitgewirkt, da viele Erwachsene besonders Männer bestimmtes Videomaterial häufig anschauten und anschauen.
Da wirst du in PHP nicht viel erreichen, 2-7GB Material herunterzuladen, bevor man es ansehen kann ist einfach nur geisteskrank xD
Vielmehr solltest du dir Gedanken darüber machen wie du die Datenmenge reduzieren oder optimieren kannst.
Den größten Vorteil erzielst du damit, wenn du das Video in ein m3u8 mit (WICHTIG) H.264 Format umwandelst.
Bei m3u8 wird nicht zuerst das komplette Video heruntergeladen, sondern das Video besteht aus sehr vielen kleinen Videosegmenten. Ein Videosegment ist z.B. 15 Sekunden lang. Dann muss du beim Abspielen des Video nur das erste Segment herunterladen, welches nur 15 Sekunden lang ist und daher sehr klein ist. Während diese 15 Sekunden abspielen hat der Browser Zeit die nächsten Segmente herunterzuladen. Dadurch lädt das Video schnell und es läuft wie ein ganz normales mp4 Video, also der Nutzer merkt keinen Unterschied.
Wenn du beim Player auf Minute 5 spingst wird das entsprechende Videosegment abgefragt, heruntergeladen und abgespielt, danach laden automatisch die nächsten Videosegmente.
Dadurch bekommst du schnelles und flüssige Videos. Das ganze kannst du mit "ffmpeg" umwandeln.
Alternativ das mp4 Video komprimieren (z.B. mit Handbrake), dann ist es sehr viel kleiner bei gleicher Qualität, dann kann man statt mp4 auch webm verwenden (wird aber nicht von allen Geräten & Browsern unterstützt).
Das ist aber mal eine proffesionelle gute antwort ich danke dir!