多数の MP4 ファイルからすべてのオーディオをリッピングするスクリプトを実行しようとしています。テキスト エディターからターミナルに 1 行ずつ切り取って貼り付けるとすべて正常に動作しますが、シェル スクリプトを作成して実行すると、一連のエラーが発生します。複数の行を切り取って貼り付けると、別のエラーが発生します。
これを行うには foreach ループを作成できますが、何が間違っているのかを理解しようとしています。以下はシェル スクリプトの一部です。
#/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
もう一度言いますが、1 行だけコピーすれば、すべて問題ありません。スクリプトを実行すると、次のようになります。
# ./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
次に、3 つ程度のグループを取得して貼り付けると、次のようになります。
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>]
私はここで何が間違っていたのかを理解しようとしているだけです。私は長年にわたりかなりの数のスクリプトを書いてきましたが、Unix の特徴の 1 つは、常に一貫性があるということです。スクリプトが壊れている可能性がありますが、コマンドを正しく実行するまでは一貫性があります。
ターミナルクライアントとして SecureCRT を使用しています。
答え1
フォルダーとそのサブフォルダーに含まれるすべての mp4 ビデオを圧縮するためだけに作成したバッチ スクリプトでも、まったく同じ問題が発生しました。3 日間の Google 検索の後、ffmpeg ではデフォルトで、担当するストリーミングのリアルタイムでのトランスコーディングが許可され、ストリームの設定と対話できることがわかりました。つまり、バッチ スクリプトにコマンドがある場合、最初の文字列は正しく実行され、2 番目の文字列は対話型コマンドとして解釈されるため、何らかのバッファーがいっぱいになってスクリプトがクラッシュするまでエラーが出力されます。ffmpeg の-nostdin
コマンド ラインに追加することで事態を回避し、すべてが正しく動作するようになりました。
サルーティ、マッシミリアーノ
答え2
次の行に基づきます:
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'
シェルは をすべてell.mp4 -b:a 192K -vn BIO06.1-Anatomy-of-the-Cell.mp3
1 つのトークンとみなしており、スペースを認識していないようです。それらはスペース文字ではなく、スペース文字のようにレンダリングされる何か他のものであると私は確信しています。
次のコマンドを実行し、出力を注意深く見てください。
od -c name_of_your_script.sh | less
これにより、各印刷可能文字は印刷可能文字としてダンプされ、すべての印刷不可能な文字は ASCII コード (8 進数だと思います) としてダンプされます。とにかく、回答に貼り付けたこの特定の文字列を探し、引数間のスペースを探します。そこにスペース以外のものが表示されている場合は、それが問題です。
答え3
スクリプトの最初の行に ! がありません。次のようになるはずです:
#!/bin/bash
ちなみに、現在のディレクトリにすべての .mp4 ファイルがある場合、これを行う別の方法は、bash では次のようになります。
for file in `ls *.mp4 | cut -d '.' -f -1 `;
do
ffmpeg -i ${file}.mp4 -b:a 192k -vn ${file}.mp3;
done
ニーズに合わせて *.mp4 の glob 基準を調整できます (例ls ../media/bio123/97*BIO*.mp4
)
上記で何が起こっているかの内訳は次のとおりです。
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
この${file}.mp4
構文は、シェルが、私が$file
for ループで定義した変数について話しているのであって、 ' という変数について話しているのではないことを認識するのに役立ちます$file.mp4'
。最後に、特別なことは何もありませんfile
。ループは次のように記述できます。
for foo in `ls *.mp4 | cut -d '.' -f -1 `;
do
ffmpeg -i ${foo}.mp4 -b:a 192k -vn ${foo}.mp3;
done