2015-08-06 20 views
6

Ich habe eine Video-Hosting-Site und habe erfolgreich installiert ffmpeg auf meinem lokalen Server. Die Dinge funktionieren insgesamt, aber ich kann die Videodauer nicht erreichen und weiß nicht, wie man Videos in das Format ogg konvertiert. Ich kann Videos in mp4 konvertieren, bin aber unsicher, ob der gleiche Code auch zu ogg konvertieren kann.ffmpeg und php, um ein Bild aus einem Video zu bekommen und Video zu Ogg

Noch eine Sache ist, dass ich eine Miniaturansicht des Videos am Anfang des Videos bekommen kann, aber ich will es nach 50 Sekunden.

$base = basename($uploadfile, $safe_file['ext']); 
       $new_file = $base.'mp4'; 
       $new_image = $base.'jpg'; 
       $new_image_path = $live_img.$new_image; 
       $new_flv = $live_dir.$new_file; 

    equire 'vendor/autoload.php'; 
     //ececute ffmpeg generate mp4 
     exec('ffmpeg -i '.$uploadfile.' -f mp4 -s 896x504 '.$new_flv.''); 
     //execute ffmpeg and create thumb 
     exec('ffmpeg -i '.$uploadfile.' -f mjpeg -vframes 71 -s 768x432 -an '.$new_image_path.''); 
+0

Warum wollen Sie Theora in OGG? Wenn Sie in diese Richtung gehen, warum nicht stattdessen VP8 (oder VP9) in WebM verwenden?Es ist ein moderneres Videoformat, und (ich vermute hier) Browser, die Theora + OGG unterstützen, sollten VP8 + WebM unterstützen. – LordNeckbeard

Antwort

6

Da Sie tatsächlich drei in einer Frage lassen Sie mich Schritt für Schritt durch diesen Schritt gehen, aber vor einiger alle Informationen über die Version und aktivierte Funktionen des ffmpeg Build i mit getestet haben dies.

ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers 
    built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) 
    configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab 
    libavutil  54. 20.100/54. 20.100 
    libavcodec  56. 26.100/56. 26.100 
    libavformat 56. 25.101/56. 25.101 
    libavdevice 56. 4.100/56. 4.100 
    libavfilter  5. 11.102/5. 11.102 
    libavresample 2. 1. 0/2. 1. 0 
    libswscale  3. 1.101/3. 1.101 
    libswresample 1. 1.100/1. 1.100 
    libpostproc 53. 3.100/53. 3.100 
Hyper fast Audio and Video encoder 

Dauer


Da Sie ffmpeg installiert haben wahrscheinlich Sie haben ffprobe auch.

ffprobe

ffprobe sammelt Informationen von Multimedia-Streams und es druckt in human- und maschinenlesbare Art und Weise ...

So die Dauer erhalten mit ffprobe Sie das tun könnte folgende:

exec('ffprobe -i input-file.mp4 -show_format | grep duration 2>&1', $result); 
echo "<pre>"; 
var_dump($result[0]); // string(19) "duration=104.022000" 
echo "</pre>"; 

- Upd aß -

LordNeckbeard so freundlich war, darauf hinzuweisen, dass es keine Notwendigkeit gibt, die grep Dienstprogramm hier zu verwenden. Und da es ein Unix-basiertes Tool ist und daher nicht auf allen Betriebssystemen vorhanden ist, ist sein Vorschlag absolut korrekt.

Also hier ist ein Beispiel ohne die Verwendung von grep, die auf der folgenden http://trac.ffmpeg.org/wiki/FFprobeTips Seite gefunden werden kann.

exec('ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input-file.mov 2>&1', $result); 
echo "<pre>"; 
var_dump($result[0]); // string(11) "5634.401068" 
echo "</pre>"; 

Thumbnail


Es ist ein Beispiel auf der ffmpeg docs Seite, die erklärt, wie mehrere Vorschaubilder aus einem Video extrahieren Aufruf ffmpeg mit den folgenden Parametern:

ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg 

Dies wird extrahiert o ne Videobild pro Sekunde aus dem Video und gibt sie in Dateien mit den Namen foo-001.jpeg, foo-002.jpeg usw. aus. Bilder werden so skaliert, dass sie den neuen WxH-Werten entsprechen.

Wenn Sie nur eine begrenzte Anzahl von Frames extrahieren möchten, können Sie den obigen Befehl in Kombination mit der Option -vframes oder -t oder in Kombination mit -ss verwenden, um mit dem Extrahieren ab einem bestimmten Zeitpunkt zu beginnen.

Um ein Miniaturbild von einem bestimmten Zeitpunkt extrahieren Sie den -ss Befehl in Kombination mit -vframes der für -frames:v ein Alias ​​verwenden würden. Hier ist ein Beispiel, wie Sie das tun würden:

exec('ffmpeg -i input.mp4 -r 1 -ss 00:00:50 -vf scale=1024:-1 -vframes 1 output.jpeg 2>&1', $result); 
echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

Aber die folgenden Informationen auf dem -ss Befehl bewusst sein.

Beachten Sie, dass es in den meisten Formaten nicht möglich ist, genau zu suchen, so dass ffmpeg den nächsten Suchpunkt vor der Position sucht. Wenn Transcodierung und -accurate_seek aktiviert ist (Standardeinstellung), wird dieses zusätzliche Segment zwischen dem Suchpunkt und der Position decodiert und verworfen. Wenn Stream-Kopien erstellt werden oder wenn -noaccurate_seek verwendet wird, werden diese beibehalten.

Stellen Sie außerdem sicher, dass der Ausgabepfad beschreibbar ist. Andernfalls wird ein Fehler, die wie folgt erhalten:

[image2 @ 0x35ae280] Could not open file : /output/path/to/your/file 

Theora und Vorbis Encoding


Dies ist die einzige Sache, die ich nicht wegen der Tatsache, testen konnte, dass meine Version von ffmpeg nicht haben die

--enable-libtheora

Flagge, wie Sie durch die obigen Informationen berichten. Sie müssen im Wesentlichen ffmpeg kompilieren, damit die benötigten Bibliotheken das Theora-Videoformat und das Vorbis-Audioformat entschlüsseln und dekodieren können.

Hier sind einige Informationen, mit denen Sie damit beginnen können.

A Brief Theora and Vorbis Encoding Guide

Wenn Sie eine benutzerdefinierte bauen mit den genannten Bibliotheken haben, sollten Sie in der Lage sein, Folgendes zu tun:

exec('ffmpeg -i input.mkv -codec:v libtheora -qscale:v 7 -codec:a libvorbis -qscale:a 5 output.ogv 2>&1', $result); 
echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

Here ist der Link zu wo die meisten dieser Informationen zu finden.

Hoffe, das hilft.

+0

Schöne Antwort, aber Sie können den 'grep' Prozess durch Ändern Ihres' ffprobe 'Befehls, wie in den Dauerbeispielen in [FFmpeg Wiki: FFprobe Tipps] (http://trac.ffmpeg.org/wiki/FFprobeTips) gezeigt, fallenlassen. Außerdem ist [scale filter] (https://ffmpeg.org/ffmpeg-filters.html#scale) viel flexibler als '-s', so dass Sie stattdessen' -vf scale = 1024: -1' verwenden können müssen Breite oder Höhe liefern; 'ffmpeg' berechnet den anderen Aspekt unter Beibehaltung. – LordNeckbeard

+0

@LordNeckbeard - Danke für den Hinweis, war mir überhaupt nicht bewusst, lernte etwas Neues, toll. Hat die Antwort aktualisiert. – DavidDomain

3

für Linux:

//video converting... 
shell_exec("$ffmpegPath -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libx264 -acodec libfdk_aac sample.mp4");//for mp4 
shell_exec("$ffmpegPath -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libtheora -acodec libvorbis sample.ogg");//for ogg 
shell_exec("$ffmpegPath -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libvpx-acodec libvorbis sample.webm");//for webm 

//Get theumbnail 
shell_exec("$ffmpegPath -i input.flv -ss 00:00:14 -vframes 1 sample.png"); 
//you can change the -ss value you want. 
//then if u want to check if you have already install ur ffmpeg just type in your terminal in linux "ffmpeg" see pic below 

enter image description here

weitere Informationen hier https://www.ffmpeg.org/documentation.html

Verwandte Themen