0

バッチモードでビデオファイルからオーディオを抽出するための小さなbashスクリプトを作成しました。

サウンドは、avconv(およびflacコーデック)を使用して、各mp4ファイルからflac形式に抽出されます。

#!/bin/sh
#
# Batch conversion of audio extraction from video

FOLDER_SRC="/home/Me/Music/TestBatchConv"

for myvid in $(find ${FOLDER_SRC} | grep mp4)
do
avconv -i $myvid -acodec flac "${myvid}.flac"
done

exit 0

正常に動作しますが、改善したいと思います。

ファイルがビデオかどうかをテストするにはどうすればよいですか?私は次のようなことを試みました

for myvid in $(find ${FOLDER_SRC})
do
    if [ file -i $myvid | grep video ]
        then avconv -i $myvid -acodec flac "${myvid}.flac"
    fi
done

しかし、私はそれを成し遂げることができません(はい、私はこれに不慣れです)。

助けていただければ幸いです。

4

3 に答える 3

3

新しいテストを次のように書き直します

 if  file -i $myvid | grep -q video  ; then

-qオプションは静かであることを意味するため、grepはtrue検索ターゲットが見つかった場合と見つからfalseなかった場合に戻ります。返されるまたは状態ifに応じて適切に応答します。truefalse

ステートメントで使用される中括弧ifは、実際にはcmdのエイリアスtestであるため、次のようになります。

  if [ $(file -i $myvid | grep video) = "video" ] ; then

また動作します。

この種のことを正しく行う方法を学ぶには、コマンドラインで作業し、一度に1ビットずつ追加します。

 file -i $myvid 

それから

file -i $myvid | grep video

また

file -i $myvid | grep -q video ; echo $?

逆を見るには、次のように変更します。

file -i $myvid | grep nonesuch ; echo $?

編集

そして、複数のものをテストするためにegrep、すなわちを使用することができます

 if  file -i $myvid | egrep -q 'video|application/octet'  ; then

IHTH

于 2013-03-07T18:41:07.780 に答える
2

最初にファイルリストを作成します

   find ${FOLDER_SRC} -type f -exec file \{\} +

の呼び出しは1回だけです。「-execcommand{}+」をfile参照して探してください。man find

スペースの簡単な回避策を追加する

   find ${FOLDER_SRC} -type f -exec file \{\} + |tr ' ' '°'

シンプルで十分。別の方法は、の使用ですmapfile

ファイルリストを繰り返し処理し、caseステートメントでアクションを定義します

   for line in $(find ${FOLDER_SRC} -type f -exec file \{\} + |tr ' ' '°')
   do
     file=${line%%:*}
     file=${file//°/ }          
     content=${line#*:}
     content=${content//°/ }          
     case "${content}" in
         *video/mp2p*) myConvertFunctionA;;
         *video/mpeg*) myConvertFunctionB;;
         *video*) echo "found unsupported video type: ${content}";;
     esac
   done
  • bashビルトインを介した文字列操作は高速です
  • caseわかりやすい
  • の複数のインスタンス化を回避するgrep
于 2013-03-07T18:42:02.473 に答える
1

'file'の使用はマジックナンバーに対して機能するため、間違っている場合があります。

「mplayer」を使用してデータを取得しました。

mplayer -ao null -vo null -endpos 0.01 ${MEDIAFILE} 2>/dev/null | egrep "AUDIO:|VIDEO:"

これにより、オーディオおよびビデオとの対戦が可能になります。どちらか一方を省略するか、egrepに「-c」を追加して、一致させることができます。

if [ `mplayer -ao null -vo null -endpos 0.01 ${MEDIAFILE} | egrep -c "VIDEO:"` -gt 0 ]; then
    # HANDLE VIDEO FILE
fi

ただし、ビデオファイルからオーディオを抽出しているため、処理するビデオファイルにもオーディオコンポーネントが含まれていることを確認する必要があります。

AVCHECK=`mplayer -ao null -vo null -endpos 0.01 ${MEDIAFILE} 2>/dev/null | egrep "AUDIO:|VIDEO:"`

if [ `echo "${AVCHECK}" | grep -c AUDIO` && `echo "${AVCHECK}" | grep -c VIDEO` ]; then
    # STRIP AUDIO FROM VIDEO FILE
fi
于 2013-03-07T20:19:40.037 に答える