Ich versuche, ein Skript auszuführen, um den gesamten Ton aus einer Reihe von MP4-Dateien zu rippen. Alles funktioniert, wenn ich es Zeile für Zeile aus meinem Texteditor ausschneide und in das Terminal einfüge, aber wenn ich dazu ein Shell-Skript erstelle, erhalte ich einen Satz von Fehlern. Wenn ich mehrere Zeilen ausschneide und einfüge, erhalte ich einen anderen Fehler.
Ich kann dazu eine Foreach-Schleife erstellen, aber ich versuche herauszufinden, was schief läuft. Hier ist ein Teil des Shell-Skripts:
#/bin/bash
ffmpeg -i 969_BIO03.1-Introduction-to-Molecular-Genetics.mp4 -b:a 192K -vn BIO03.1-Introduction-to-Molecular-Genetics.mp3
ffmpeg -i 970_BIO03.2-DNA-Replication.mp4 -b:a 192K -vn BIO03.2-DNA-Replication.mp3
ffmpeg -i 971_BIO03.3-DNA-Repair.mp4 -b:a 192K -vn BIO03.3-DNA-Repair.mp3
ffmpeg -i 972_BIO03.4-Transcription.mp4 -b:a 192K -vn BIO03.4-Transcription.mp3
Wenn ich nur eine Zeile kopiere, ist alles in Ordnung. Wenn ich das Skript ausführe, erhalte ich:
# ./ripaudio.sh
ffmpeg version N-52501-gd783297 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 15:57:34 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration: --enable-gpl --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264
libavutil 52. 27.101 / 52. 27.101
libavcodec 55. 6.100 / 55. 6.100
libavformat 55. 3.100 / 55. 3.100
libavdevice 55. 0.100 / 55. 0.100
libavfilter 3. 60.102 / 3. 60.102
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '969_BIO03.1-Introduction-to-Molecular-Genetics.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.3.100
Duration: 00:08:30.49, start: 0.021333, bitrate: 733 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 596 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
handler_name : SoundHandler
'NULL @ 0x243c8c0] Unable to find a suitable output format for 'BIO03.1-Introduction-to-Molecular-Genetics.mp3
: Invalid argumenton-to-Molecular-Genetics.mp3
ffmpeg version N-52501-gd783297 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 15:57:34 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration: --enable-gpl --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264
libavutil 52. 27.101 / 52. 27.101
libavcodec 55. 6.100 / 55. 6.100
libavformat 55. 3.100 / 55. 3.100
libavdevice 55. 0.100 / 55. 0.100
libavfilter 3. 60.102 / 3. 60.102
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '970_BIO03.2-DNA-Replication.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.3.100
Duration: 00:27:38.52, start: 0.021333, bitrate: 709 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 572 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
handler_name : SoundHandler
'NULL @ 0x357b8a0] Unable to find a suitable output format for 'BIO03.2-DNA-Replication.mp3
: Invalid argumentation.mp3
Wenn ich dann eine Gruppe von etwa 3 nehme und diese einfüge, erhalte ich Folgendes:
ffmpeg -i 974_BIO05.2-Prokaryotes.mp4 -b:a 192K -vn BIO05.2-Prokaryotes.mp3
ffmpeg version N-52501-gd783297 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 15:57:34 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration: --enable-gpl --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264
libavutil 52. 27.101 / 52. 27.101
libavcodec 55. 6.100 / 55. 6.100
libavformat 55. 3.100 / 55. 3.100
libavdevice 55. 0.100 / 55. 0.100
libavfilter 3. 60.102 / 3. 60.102
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '974_BIO05.2-Prokaryotes.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.3.100
Duration: 00:21:53.75, start: 0.021333, bitrate: 708 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 571 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 59.94 tbc
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
handler_name : SoundHandler
Output #0, mp3, to 'BIO05.2-Prokaryotes.mp3':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
TSSE : Lavf55.3.100
Stream #0:0(eng): Audio: mp3, 48000 Hz, stereo, fltp, 192 kb/s
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:1 -> #0:0 (aac -> libmp3lame)
Press [q] to stop, [?] for help
stream #1:390kB time=00:00:16.58 bitrate= 192.6kbits/s
keyframe=1
duration=0.021
dts=332.480 pts=332.480
size=375
stream #1:
keyframe=1
duration=0.021
dts=332.501 pts=332.501
size=355
[trimmed out hundreds of lines of this repeating pattern]
stream #1:
keyframe=1
duration=0.021
dts=337.109 pts=337.109
size=364
stream #1:
keyframe=1
duration=0.021
dts=337.131 pts=337.131
size=318
Enter command: <target> <time> <command>[ <argument>]
Parse error, at least 3 arguments were expected, only 1 given in string 'ell.mp4 -b:a 192K -vn BIO06.1-Anatomy-of-the-Cell.mp3'
size= 8408kB time=00:05:58.70 bitrate= 192.0kbits/s
Enter command: <target> <time> <command>[ <argument>]
Ich versuche nur zu verstehen, was hier schiefgelaufen ist. Ich habe über die Jahre eine ganze Menge Skripte geschrieben und das Besondere an Unix ist, dass es immer konsistent ist. Ihr Skript ist möglicherweise fehlerhaft, aber in dieser Hinsicht ist es konsistent, bis Sie Ihren Befehl richtig eingeben.
Ich verwende SecureCRT als Terminalclient.
Antwort1
ich hatte genau dasselbe Problem mit meinem Batch-Skript, das ich geschrieben hatte, um alle meine MP4-Videos zu komprimieren, die in einem Ordner und seinen Unterordnern enthalten waren. Es stellte sich heraus (nach 3 Tagen Googeln), dass FFMPEG standardmäßig die Transkodierung des verantwortlichen Streamings in Echtzeit zulässt und daher die Möglichkeit bietet, mit den Einstellungen des Streams zu interagieren. Dies bedeutet, dass, wenn Befehle in einem Batch-Skript enthalten sind, der erste korrekt ausgeführt und die zweite Zeichenfolge als interaktiver Befehl interpretiert wird, sodass Fehler ausgegeben werden, bis eine Art Puffer voll ist und das Skript abstürzt. Ich habe mir den Tag gerettet, indem ich es -nostdin
zur FFMPEG-Befehlszeile hinzugefügt habe, und jetzt funktioniert alles korrekt.
Saluti, Massimiliano
Antwort2
Basierend auf der folgenden Zeile:
Parse error, at least 3 arguments were expected, only 1 given in string 'ell.mp4 -b:a 192K -vn BIO06.1-Anatomy-of-the-Cell.mp3'
Es scheint, dass die Shell alles für ein einzelnes Token hält ell.mp4 -b:a 192K -vn BIO06.1-Anatomy-of-the-Cell.mp3
und die Leerzeichen nicht erkennt. Ich bin bereit zu wetten, dass es sich dabei überhaupt nicht um Leerzeichen handelt, sondern um etwas anderes, das wie ein Leerzeichen dargestellt wird.
Führen Sie den folgenden Befehl aus und sehen Sie sich die Ausgabe genau an
od -c name_of_your_script.sh | less
Dadurch wird jedes druckbare Zeichen als druckbares Zeichen und alle nicht druckbaren Zeichen als ihr ASCII-Code ausgegeben (ich glaube, es ist oktal). Suchen Sie jedenfalls nach dieser bestimmten Zeichenfolge, die ich in meine Antwort eingefügt habe, und suchen Sie nach den Leerzeichen zwischen den Argumenten. Wenn Sie dort etwas anderes als ein Leerzeichen sehen, ist das Ihr Problem.
Antwort3
In der ersten Zeile Ihres Skripts fehlt meiner Meinung nach ein !, dort müsste stehen:
#!/bin/bash
Wenn Sie alle MP4-Dateien im aktuellen Verzeichnis haben, können Sie dies übrigens auch folgendermaßen in Bash tun:
for file in `ls *.mp4 | cut -d '.' -f -1 `;
do
ffmpeg -i ${file}.mp4 -b:a 192k -vn ${file}.mp3;
done
Sie können die Glob-Kriterien in der *.mp4-Datei Ihren Bedürfnissen entsprechend anpassen (z. B. ls ../media/bio123/97*BIO*.mp4
)
Die Aufschlüsselung der oben genannten Vorgänge:
ls *.mp4 // Get a list of all the MP4s in the current directory.
ls *.mp4 | cut -d '.' -f -1 // Get everything from the filename before the terminal . in the filename
Dann ${file}.mp4
hilft die Syntax der Shell nur zu erkennen, dass ich über die Variable spreche, $file
die in meiner for-Schleife definiert ist, und nicht über eine Variable namens ' $file.mp4'
. Schließlich ist nichts Besonderes daran file
- Sie könnten die Schleife wie folgt schreiben:
for foo in `ls *.mp4 | cut -d '.' -f -1 `;
do
ffmpeg -i ${foo}.mp4 -b:a 192k -vn ${foo}.mp3;
done