2013-05-23 3 views
3

하지 않습니다 : 그것은 한 번 실행 만 수행하고 4 개의 다른 형식으로 입력 파일 이름을 변환bash는 스크립트는 좀 MP4 파일의 일괄 변환이 bash는 스크립트가 루프

#!/bin/bash 
ls dr*.mp4 | grep -v -E "\.[^\.]+\." | sed "s/.mp4//g" | while read f 
do 
    TARGET="$f.ffmpeg.mp4" 
    if ! [ -f $TARGET ] 
    then 
     echo $TARGET 
     ffmpeg -nostdin -i $f.mp4 -s 320x180 -vc h264 -acodec copy -f mp4 -y $TARGET 
    fi 

    TARGET="$f.ffmpeg.flv" 
    if ! [ -f $TARGET ] 
    then 
     echo $TARGET 
     ffmpeg -nostdin -i $f.mp4 -s 320x180 -acodec copy -y $TARGET 
    fi 

    TARGET="$f.jpg" 
    if ! [ -f $TARGET ] 
    then 
     echo $TARGET 
     ffmpeg -nostdin -i $f.ffmpeg.mp4 -ss 0 -vframes 1 -f image2 $TARGET 
    fi 

    TARGET="$f.ffmpeg.ogv" 
    if ! [ -f $TARGET ] 
    then 
     echo $TARGET 
     ffmpeg -nostdin -i $f.mp4 -s 320x176 -ar 11025 -acodec libvorbis -y $TARGET 
    fi 
done 

, 그러나 않습니다 다음 입력 파일 이름으로 반복하지 마십시오. 여러 차례의 변환 순서를 섞어 보려고했지만 스크립트는 한 파일 이름에 대해 한 번만 실행됩니다. 는 내가 -nostdin 플래그는 FFmpeg를 실행하려고하지만

"Unrecognized option 'nostdin'" 

는 FFmpeg 버전이는 FFmpeg 버전 0.10.6-6 말한다 : 0.10.6-0ubuntu0jon1가 ~ lucid2 - 난 그냥 http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu로부터는 FFmpeg 패키지를 업데이트 최신 버전을 찾을 수 없습니다. 기본 시스템은 대신 glob 빙을 사용할 수

Distributor ID: Ubuntu 
Description: Ubuntu 10.04.1 LTS 
Release:  10.04 
Codename:  lucid 
+1

'ls dr * .mp4 |의 출력은 무엇입니까? grep -v -E "\. [^ \.] + \." | sed "s/.mp4 // g"'? – slhck

답변

2

Don't parse the Output of ls입니다. -nostdin 옵션 ffmpeg 1.0에 추가당한 ChangeLog에 따라, 당신이 얻을 오류에 관해서는

for input in dr*.mp4; do 
    output=${input%.mp4}.ffmpeg.mp4 
    [ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -vc h264 -acodec copy -f mp4 -y "${output}" 

    output=${input%.mp4}.ffmpeg.flv 
    [ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -acodec copy -y "${output}" 

    [...] 
done 

, 그래서 당신은 0.1x에서 ffmpeg 설치를 업데이트해야합니다 : 당신은 또한 파일 이름에 가능한 공백을 설명하기 위해 변수를 인용한다 1.0.x.

0

while 루프에서 같은 문제가 발생하여 ffmpeg 명령 중 하나에서 -nostdin 플래그가 누락되어서 발생했습니다. 나는 read이 표준 입력에서 ffmpeg 명령을 가지고있는 것이 데이터의 일부를 먹고 있기 때문에 읽는다고 생각한다.

find /tmp/dir -name '*-video' | while read -r file; do 
    # note: I forgot -nostdin on the ffmpeg command 
    ffmpeg -i "$file" -filter:v "amazing_filtergraph" out.mp4 
done 

내가 찾을 수 없습니다 tmp/dir/1-video에 대한 오류가 (처음 슬래시 경로에서 누락 된 알) 얻을 것 : 내 경우에는, 내 while 루프는 같았다. -nostdin을 추가하자마자 문제가 해결되었습니다.

또한 while 루프에서는 거의 always want to use the -r flag입니다. 그렇지 않으면 예기치 않은 줄 바꿈이 발생할 수 있습니다.