2016-05-27 5 views
-5

UbuntuサーバーにBigBlueButton(ビデオ会議)プラットフォームをインストールしてミーティングを記録しています。このプロセスは、録画が終了した後に、以下である: Rubyのファイルメソッドがうまくいかず、スクリプトが失敗する

  • A Rubyスクリプトが処理して公開するために使用される記録

  • を公開

    • プロセス記録を、溶液のコアです。私は、ウェブカメラビデオからサムネイルを生成し、それを公開スクリプトに追加する機能を追加しています。プロセススクリプトが完了すると、公開スクリプトが実行され、Webカメラビデオが存在するかどうかが確認されます。存在する場合は、ビデオをパブリッシングディレクトリにコピーし、新しい機能を使用してサムネイルを生成します。問題は、機能を追加した後、publishスクリプトがpublish.failエラーで失敗することです。ここで

      は、新機能のコードです:

      def GenerateThumbnails(video_dir,x) 
          BigBlueButton.logger.info("Making Thumbnails dir") 
          thumb_dir = "#{video_dir}/thumbnails" 
          FileUtils.mkdir_p thumb_dir 
      
          if x == true 
          BigBlueButton.logger.info("Made Thumbnails dir - Generating Thumbnails") 
      
          command="ffmpeg -ss 5 -i #{video_dir}/webcams.webm -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr -vf fps=fps=1/10 #{thumb_dir}/thumb%d.jpg" 
      
          # -ss 5 : To discard the 5 first seconds of the video. 
          # -vf "select=gt(scene\,0.4)" : To filter only frames # that have 40% change or more,compared to previous  # frames. 
          # -frames:v 5 : To get 5 frames in total. 
          # -vsync vfr : Makes sure that the 5 frames,are different # from each others. 
          # -vf fps=fps=1/10 : Generates 1 thumbnail for everty # 10th span of the video. 
      
          BigBlueButton.execute(command) 
          BigBlueButton.logger.info("Generated Thumbnails - Picking the most representative thumbnail") 
      
          # The following code picks the thumbnail with the biggest  # size,since more size means more details. 
      
          i = (1..5).map {|i| File.size("#{thumb_dir}/thumb#{i}.jpg").to_f }.each_with_index.max[1] 
      
          File.rename("#{thumb_dir}/thumb#{i + 1}.jpg", "thumbnail.jpg") 
      
          # We get an array of file sizes from thumb1.jpg up to # thumb5.jpg 
          # Then,we get the index of the greatest value of the  # array. 
          # Finally , now that we know that i is the index of the # greatest value in the array, then thumb#{(i+1)}.jpg is # the file with the greatest size, so that's the one we # want to replace the name of,with 'thumbnail.jpg' ,which # will be called later in the image source. 
      
          BigBlueButton.logger.info("Picked the most representative thumbnail") 
          else 
          BigBlueButton.logger.info("Made Thumbnails dir - Copying the standard wrap image to the folder") 
          FileUtils.cp("/var/lib/tomcat7/webapps/ROOT/remark/remark/global/photos/views-960x640.jpg","#{thumb_dir}") 
          File.rename("#{thumb_dir}/views-960x640.jpg", "thumbnail.jpg") 
          end 
      end 
      

      Hereを公開するために使用Rubyコードです。

      次のように私は、開始する前に私の機能を追加し、次に開始以内にそれを呼ばれる:

      • GenerateThumbnails(video_dir,true)をライン951
      • GenerateThumbnails(video_dir,false)でライン953

      編集で:

      実際にログファイルに記録される内容は次のとおりです。

      許可が拒否されました - (/foo/thumbnails/thumb7.jpg、thumbnail.jpg)私はこのように、アクセス権を強制しようとした

      :しかし、私はまだ取得

      File.chmod(0777, "#{thumb_dir}/thumb#{i + 1}.jpg") rescue nil 
      File.rename("#{thumb_dir}/thumb#{i + 1}.jpg", "thumbnail.jpg") 
      

      を同じエラー。

      私はパブリッシュスクリプトを書きませんでした。私は、この新しい関数をパブリッシュスクリプト全体で適切に動作させようとしています。

      問題を解決するにはどうすればよいですか?

    +0

    'command =" ffmpeg -ss 5 -i#{video_dir} /webcams.webm -vf "select = gt(scene \、0.4)"行にタイプミスがあります。-frames:v 5 -vsync vfr - vf fps = fps = 1/10#{thumb_dir} /thumb%d.jpg "'? そうでない場合は、文字列を途中で閉じることになります:) – Ninigi

    +0

    typoとはどういう意味ですか? – MrRobot

    +0

    また、バックスラッシュはルビ文字列のエスケープ演算子なので、別のバックスラッシュ 'scene \\、0.4'を使ってバックスラッシュをエスケープする必要があります。 – Ninigi

    答えて

    1

    は、あなたが

    私はあなたの文字列内の引用符を持つようにしたいと思いますが、意図せずしている(コードがselect=gt(scene\,0.4)で色がどのように変化するかに注意してください)ライン

    command="ffmpeg -ss 5 -i #{video_dir}/webcams.webm -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr -vf fps=fps=1/10 #{thumb_dir}/thumb%d.jpg" 
    

    に早まった文字列を閉じているようです代わりに文字列を閉じます。このような引用符をエスケープしてみてください。

    command="ffmpeg -ss 5 -i #{video_dir}/webcams.webm -vf \"select=gt(scene\\,0.4)\" -frames:v 5 -vsync vfr -vf fps=fps=1/10 #{thumb_dir}/thumb%d.jpg" 
    

    また、あなたは、GT(シーン\ 0」でバックスラッシュを必要とすることを確認します。Linuxでは、renameもファイルを移動することができる

    File.rename("#{thumb_dir}/thumb#{i + 1}.jpg", "thumbnail.jpg") 
    

    注意、それは何が起こっているかです:; 4)」、私には少し奇妙に見える失敗のコードの)

    1

    行はこれです。ここで私は、ファイルが移動されることを意図していることを信じていないので、行は次のようになります。あなたは、ファイルを移動するつもりなかった場合

    File.rename("#{thumb_dir}/thumb#{i + 1}.jpg", "#{thumb_dir}/thumbnail.jpg") 
    

    しかし、あなたも(適切なディレクトリを指定する必要がありますそれがthumb_dirの場合)、それはちょうどcに移動することはありませんurrentディレクトリは暗黙的に簡単に変更できます。

    File.rename("#{thumb_dir}/thumb#{i + 1}.jpg", "#{thumb_dir}/thumbnail.jpg") 
    

    どうしてですか?あなたのプロセスユーザには、現状どおりにディレクトリのディレクトリに書き込む権限がありません。 File#chmodへの呼び出しは、残念なことに赤いニシンです。ファイルが存在する限り、たとえそれが黙って失敗しても何もしなくても、ほぼ成功するでしょう。しかし、File#renameは黙って失敗することはありません。

    ファイルを現在のディレクトリに移動する場合は、アプリケーションが実行されるプロセスに、現在のディレクトリに書き込むための適切な権限があることを確認してください。あなたがPermission deniedエラーが続く場合は、File#rename行の前に次のコードを挿入します。

    listing = `ls -la .` 
    puts "Directory: #{listing}" 
    

    これは、実際のファイルのパーミッションが現在のディレクトリのためのプロセスのユーザーのために何であるかを教えてくれます。そこから、適切な措置を講じることができます。

    +0

    上記のコードで見ることができるようにプロセスが実際にそのthumb_dirを作成したので、作成と名前変更に同じ権限が必要なので、適切な権限があることを確信しています。さらに、ディレクトリは私のために知られているので、私はパーミッションと所有者を知っているので、両方とも755 – MrRobot

    +0

    @MrRobotあなたのフィードバックをありがとう。私はそれに応じて答えを更新し、私はあなたの問題を解決すると思います。以前のコンテンツのほとんどは保存しましたが、新しい提案に基づいて少し変更しました。私はそれが助けてくれることを願う。 –

    関連する問題