1

そこで、新しく書き込まれたビデオ ファイルを取得し、サーバーでの再生とストリーミング用にトランスコードするための bash スクリプトを作成しました。スクリプトは次のとおりです。

  while true; do
    printf -v filename '%q' "$(inotifywait --format "%w""%f" -r -e close_write /var/$
    echo $filename
            if [[ $filename == *".mp4"* ]]; then
                    echo "1"
                    avconv -i "$filename" "`echo ${filename%.mp4}.webm`"
            fi

            if [[ $filename == *".mkv"* ]]; then
                    echo "2"
                    avconv -i "$filename" "`echo ${filename%.mkv}.mp4`"
                    avconv -i "$filename" "`echo ${filename%.mkv}.webm`"
            fi

            if [[ "$filename" == *".avi"* ]]
                    then echo "3"
                    avconv -i "$filename" "`echo ${filename%.avi}.mp4`" &
                    avconv -i "$filename" "`echo ${filename%.avi}.webm`"&
                 fi
      done

スクリプトはかなりうまく機能しますが、$filename にスペースが含まれている場合、avconv が中断し、スクリプトは次のように戻ります。

      Watches established.
      /var/www/media2net/tv/The\ Daily.mkv
      2
      avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav s
      built on Nov  6 2012 16:51:33 with gcc 4.6.3
       /var/www/media2net/tv/The\: No such file or directory
      avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav 
      built on Nov  6 2012 16:51:33 with gcc 4.6.3
      /var/www/media2net/tv/The\ Daily.mkv: No such file or directory
      Setting up watches.  Beware: since -r was given, this may take a while!
      Watches established.

ただし、上記のファイルをそれぞれのディレクトリ内で表示できるため、これは正しくありません。また、シェルで次のように avconv をテストしましたが、すべてが正常に動作し、avconv はビデオをトランスコードします

       avconv -i /var/www/media2net/The\ Daily.mkv /var/www/media2net/tv/The\ Daily.webm

基本的に、スクリプトで何が間違っているのか、または他の誰かが avconv または ffmpeg を使用して同様の問題を経験したことがあるかどうか疑問に思っています (2 つはかなり似ており、avconv はプロジェクトの ubuntu のフォークであるため) どんな助けでも大歓迎です! 前もって感謝します-ブレンダン

4

1 に答える 1

1

エスケープバックスラッシュと引用符の使用法にはいくつかの矛盾があるようです。実際、必要なのは2つのうちの1つだけであり、使いやすいのは確かに引用符です。

したがって、ファイル名のバックスラッシュを削除することは、最初に行うべき良いことです。

さらに、

"$(inotifywait --format "%w""%f"...

で修正する必要があります:

"$(inotifywait --format '%w%f'...

また、次のようなものを理解する行:

"`echo ${filename%.mkv}.mp4`"

実際のところ、あなたはエコーしているように、やや曖昧です-中にスペースがある場合-2$filenameつの文字のチェーン-。修正する必要があります:

"${filename/%.mkv/.mp4}"
于 2013-01-31T18:37:01.553 に答える