2012-04-02 2 views
1

So hatte ich unglaubliche Probleme beim Erstellen einer Binärdatei von ffmpeg für Mac, die für alle meine Bedürfnisse richtig funktioniert. Ich habe einen älteren Build, der funktioniert super Remuxing h264 Video ohne Probleme, aber fehlt eine Bibliothek, die ich brauche, nämlich libspeex. Ich habe einen neueren Build erstellt, der auf ffmpegs Git basiert, der libspeex enthält, aber abstürzt, wenn h264 aus .flv-Dateien mit schlechten Timecodes remumuxiert wird (Live-Dumps von rtmpdump). Also habe ich zwei ffmpeg Binaries, die jeweils die Hälfte von dem machen, was ich brauche. Dies ist, was ich als meine aktuelle .command Datei:Wie kann ich die Ausgabe von ffprobe analysieren und ffmpeg abhängig vom Ergebnis ausführen?

for f in ~/Desktop/Uploads/*.flv 
do 
/usr/local/bin/ffmpeg -i "$f" -vcodec copy -acodec libfaac -ab 128k -ar 48000 -async 1 "${f%.*}".mp4 && rmtrash "$f" || rmtrash "${f%.*}".mp4 
done 

Diese ffmpeg hat libspeex enthalten, so kann es speex Audio in den .flv Eingabedateien dekodieren. Was ich suche, ist etwas zu tun, wie dieser Pseudo-Code (mein erster Versuch Pseudo-Code, mit mir so kahl!):

for f in ~/Desktop/Uploads/*.flv 
do 
ffprobe input.flv 
    if Stream #0:1 contains speex 
     ffmpeg-speex -i input.flv -acodec copy -async 1 output.m4a 
    fi 
ffmpeg-h264 -i input.flv -vcodec copy output.mp4 
MP4Box -add output.mp4 -add output.m4a finaloutput.mp4 
done 

so etwas wie dies möglich ist? Gibt es Alternativen? (Wer will mir ffmpeg für Mac mit libspeex, libfaac und libx264 bauen?; D) Alle Ideen sind hier willkommen! Vielen Dank.

+0

Wie sieht die Ausgabe von ffprobe aus? Es wäre wahrscheinlich ziemlich einfach, Grep darauf laufen zu lassen. –

+0

'Eingabe # 0, flv, von '/Users/Greeny/Desktop/input.flv':Dauer: 00: 37: 01.36, Start: 0.000000, Bitrate: 351 kb/s Stream # 0: 0: Video: h264 (Main), yuv420p, 320x240 [SAR 1: 1 DAR 4: 3], 15 tbr, 1k tbn, 30 tbc Stream # 0: 1: Audio: Speex, 16000 Hz, 1 Kanäle, s16' –

+0

Kommentare sind unmöglich zu Format! -.- –

Antwort

1

Sie könnten grep an seinem Ausgang laufen und prüfen, ob es die gewünschte Zeichenfolge gefunden:

for f in ~/Desktop/Uploads/*.flv; do 
    if ffprobe ${f} 2>&1 | egrep 'Stream #0:1.+speex'; then 
     ffmpeg-speex -i ${f} -acodec copy -async 1 ${f/%.flv/.m4a} 
     SPEEX_ADD="-add ${f/%.flv/.m4a}" 
    fi 
    ffmpeg-h264 -i ${f} -vcodec copy ${f/%.flv/.mp4} 
    MP4Box -add ${f/%.flv/.mp4} ${SPEEX_ADD} ${f/%.flv/-final.mp4} 
done 

eine Eingabedatei Angenommen abc.flv, ffmpeg-speex ausgeben würde abc.m4a, ffmpeg-h264 ausgeben würde abc.mp4 und MP4Box ausgeben würde abc-final.mp4.

Bearbeiten: Fixed zu grep auf Stderr auch; Problem behoben, bei dem eine nicht vorhandene .m4a-Datei als Eingabe an MP4Box übergeben wurde.

+0

Es findet keine Speex in der Zeile mit diesem Code:/Springt einfach rechts auf den Video-Teil –

+1

Anscheinend ffprobe gibt Ausgaben an stderr aus. Hinzugefügt 2> & 1 und es scheint mit dem Extrahieren von Audio zu arbeiten. Jetzt muss ich nur herausfinden, warum MP4Box fehlschlägt ... –

+0

Ich weiß nicht, ob dies das Problem ist, das Sie haben, aber ich habe gerade ein Problem mit meiner Antwort behoben, wobei MP4Box die .m4a-Datei als Eingabe erhalten würde , auch wenn ffmpeg-speex es nie erstellt hat. –

Verwandte Themen