Erstellen von Videos mit Audio und Standbild für YouTube

23

Ich führe den folgenden Befehl aus:

ffmpeg -i audio.mp3 -ar 44100 -f image2 -i logo.jpg -r 15 -b 1800 -s 640x480 foo.mov

Was erfolgreich ein Video mit meinem aufgenommenen Audio und einem Bild darauf ausgibt.

Wenn ich versuche, dies auf YouTube hochzuladen, kann es nicht verarbeitet werden, unabhängig von den Formaten, die ich versuche: .mov, .avi, .flv, .mp4

Gibt es eine Einstellung, die mir oben fehlt und die ein Format erzeugt, das Youtube akzeptiert? Ich habe versucht, die ffmpeg-Dokumentation durchzusehen, bin aber über den Kopf gegangen.

Ich habe ein Experiment durchgeführt, indem ich ein 2-Sekunden-Video mit einer 30-Sekunden-MP3-Datei aufgenommen habe. Beim Hochladen auf YouTube war das resultierende Video nur 2 Sekunden lang. So kann es sein, dass YouTube nur nach der Länge der Videospur schaut, und da ein Bild nur einen Frame lang ist oder was auch immer, ist es vielleicht so, dass es kaputt geht.

thekevinscott
quelle

Antworten:

13

Folgendes hat funktioniert:

ffmpeg -i audio.mp3 -f image2 -loop 1 -i logo.jpg 
-r 15 -s 640x480 \
-c:v libx264 -crf 18 -tune stillimage -preset medium \
-shortest foo.mov

Insbesondere die loopOption, mit der das Bild als Rahmen dupliziert wird. Außerdem muss die shortestOption aktiviert sein, dass die Datei nicht wächst und wächst (auf diese Weise wird sie auf die Länge des kürzesten Streams gekürzt - hier die Audiodatei).

Die rOption ändert die Bildrate und crf 18legt die Qualität fest (verwenden Sie hier einen höheren Wert für eine niedrigere Videoqualität). Weitere Informationen finden Sie hier: FFmpeg: Das ultimative Video- und Audiomanipulations-Tool

thekevinscott
quelle
2
Funktioniert bei mir nicht. Ich bekomme einen Einbild-Film.
Pavel Vlasov
Ich arbeite jetzt für mich.
Molnarg
4

Ein Stück Code, der für mich funktioniert, aus einem anderen Forum:

ffmpeg -loop 1 -r ntsc -i image.jpg -i song.mp3 -c:a copy -c:v libx264 -preset fast -threads 0 -shortest output.mkv 
Pavel Vlasov
quelle
2

Ich nahm den Code von Pavel, der auch für mich funktionierte, und verkürzte ihn, indem ich unnötige Optionen schnitt:

ffmpeg -loop 1 -shortest -i <audio file> -i <image file> <output video file>

Dies ist eine allgemeine Form, die mit jeder Bild- und Audiodatei als Eingabe arbeitet und eine Videodatei als Ausgabe erzeugt.

Da Ihr Videostream jedoch aus einem Bild besteht, das auf unbestimmte Zeit wiederholt wird, können Sie eine niedrige Bildrate (dh die Anzahl der Bilder, die in einer Sekunde angezeigt werden) einstellen -r. Beachten Sie, dass nicht alle Ausgabecontainer niedrige Bildraten zulassen. Eine, die dies tut, ist avi, also könnten Sie Folgendes tun:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> output.avi

Dadurch wird eine Videodatei mit einer Bildrate von 0,1 (dh ein Bild alle 10 Sekunden) anstelle der Standardeinstellung von 25 erstellt. Dies wirkt sich auf die Dateigröße, jedoch nicht auf die Videoqualität aus. Schließlich können Sie die Audio-Bitrate einstellen, um eine bessere Audioqualität zu erzielen -ab. Dies ist der Befehl, den ich tatsächlich verwende, um diese Art von Videos für YouTube zu erstellen:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> -ab 128k output.avi
etuardu
quelle
Vielen Dank. Ich lief ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.aviaber bekam "Option Schleife nicht gefunden." Irgendwelche Ideen?
Colonel Panic
@col Wenn Sie immer noch interessiert sind: Sie benötigen die Option loop vor der Bildeingabe, nicht vor dem Audio.
Slhck
Das hat bei mir funktioniert:ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
Karolinger
2

mit avconv:

avconv -i input.mp3 -loop 1 -f image2 -i logo.png -r 30 -s 640x480 -ab 128k -ar 44100 -ac 1 -ss 00:00:00.000 -t 01:02:03.123 foo.ogv
ZiTAL
quelle
Willkommen bei SuperUser und vielen Dank für Ihre Antwort. Etwas detaillierter darüber, was Sie vorschlagen und warum dies hilfreich wäre.
Brad Patton
1
Die Antwort ist, weil ffmpeg veraltet ist
ZiTAL
2
Nein, das ffmpeg-Projekt ist noch nicht abgeschlossen. Es gab einen Streit, der zur veralteten Nachricht führte. Siehe stackoverflow.com/questions/9477115/…
Brad Patton
2
Verwenden Sie die -shortestAusgabeoptionen, anstatt Zeiten manuell zu deklarieren (verwenden Sie auch, wenn möglich , ffmpeganstatt avconv).
Logan
2
Erstellt
0

Nachdem ich viel experimentiert hatte, funktionierte das: https://www.youtube.com/watch?v=qjlDT819Q3s

  1. Konvertieren Sie Bilder in Videos gemäß https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images :

    ffmpeg -framerate 1/20 -i png/img-%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4

    Hier verwende ich mehrere Bilder und lasse sie alle 20s wechseln.

  2. Verknüpfen Sie genügend Kopien des obigen Videos, um die Dauer Ihres Audios gemäß https://trac.ffmpeg.org/wiki/Concatenate zu überbrücken . Andere Lösungen, wie die Erwartung ffmpeg -i wav.wav -i png.mp4 youtube.mp4, das Richtige zu tun, wurden von YouTube abgelehnt (auch Player wie VLC sind verwirrt und können nicht richtig suchen). Ich vermute, dass die Zeitpositionen in den Kopien angepasst werden müssen, was ffmpegnicht der Fall ist, es sei denn, sie sind verkettet:

    ffmpeg -f concat -i pngs.txt -c copy pngs.mp4

    (wobei die Datei pngs.txthandgemacht ist, um so viele Kopien wie nötig zu enthalten: Kopien = Audiolänge / Videolänge)

  3. Mische dein Audio mit dem in 2 erhaltenen Video gemäß https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/ :

    ffmpeg -i pngs.mp4 -i wav.wav -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4

Jetzt sollte die Datei youtube.mp4von YT akzeptiert werden.

infojunkie
quelle