미친 터미널 동작

미친 터미널 동작

여러 MP4 파일에서 모든 오디오를 추출하는 스크립트를 실행하려고 합니다. 줄 단위로 잘라내어 텍스트 편집기에서 터미널에 붙여 넣으면 모든 것이 작동하지만 이를 수행하기 위해 쉘 스크립트를 만들면 한 세트의 오류가 발생하고 여러 줄을 잘라내어 붙여넣으면 다른 오류가 발생합니다. .

이를 위해 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

다시 말하지만, 한 줄만 복사하면 모든 것이 괜찮습니다. 스크립트를 실행하면 다음과 같은 결과를 얻습니다.

# ./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에 대한 한 가지 점은 항상 일관성이 있다는 것입니다. 스크립트가 손상되었을 수 있지만 명령을 올바르게 수행할 때까지는 일관성이 있습니다.

SecureCRT를 터미널 클라이언트로 사용하고 있습니다.

답변1

나는 폴더와 그 하위 폴더에 포함된 모든 mp4 비디오를 압축하기 위해 작성된 배치 스크립트에서 동일한 문제를 겪었습니다. ffmpeg는 기본적으로 스트리밍의 실시간 트랜스코딩을 허용한다는 사실이 3일 동안 검색된 후에 밝혀졌습니다. 담당하므로 스트림 설정과 상호 작용할 수 있다는 것은 명령이 배치 스크립트에 있을 때 첫 번째 문자열이 올바르게 실행되고 두 번째 문자열이 대화형 명령으로 해석되어 일종의 정렬이 될 때까지 오류를 인쇄한다는 것을 의미합니다. 버퍼가 가득 차서 스크립트가 충돌하는 경우 -nostdinffmpeg 명령줄에 추가하여 하루를 절약했고 이제 모든 것이 올바르게 작동합니다.

살루티, 마시밀리아노

답변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쉘은 모든 것이 단일 토큰이라고 생각하고 공백을 인식하지 못하는 것 같습니다 . 나는 그것들이 전혀 공백 문자가 아니라 공백 문자처럼 렌더링되는 다른 것이라고 확신합니다.

다음 명령을 수행하고 출력을 주의 깊게 살펴보십시오.

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

그런 다음 구문 은 ' 라는 변수가 아니라 for 루프에 정의된 변수 ${file}.mp4에 대해 이야기하고 있음을 쉘이 알도록 도와줍니다 . 마지막으로 특별한 것은 없습니다 . 루프를 다음과 같이 작성할 수 있습니다.$file$file.mp4'file

for foo in `ls *.mp4 | cut -d '.' -f -1 `; 
do 
ffmpeg -i ${foo}.mp4 -b:a 192k -vn ${foo}.mp3; 
done

관련 정보