2016-05-12 20 views
0

さまざまな形式の大量のビデオをトランスコードする必要があるサービスがあります。サービスは5つのスレッド、単一のビデオのための1つを生成します、各スレッドは、次のコマンドでのffmpegを実行し、X及びYは、元のファイル、基本的に、そのいずれか640:trunc(ow*a/2)*2の向きに基づいて所望の寸法であるマルチスレッド環境で実行するとffmpegがハングアップする

ffmpeg -i %%FILEPATH%% -vf scale=X:Y -ab 128k -c:a aac -movflags faststart -strict -2 -ar 22050 -r 24 -c:v libx264 -crf 25 -y %%OUTPUT.MP4%%

風景の場合はtrunc(oh*a/2)*2:640、肖像の場合はtrunc(oh*a/2)*2:640です。サービスは、Javaで書かれたとUbuntu Serverの14.04上で実行されているとマシンが64ビットオクタコアサーバです

ffmpeg version 2.4.3-1ubuntu1~trusty6 Copyright (c) 2000-2014 the FFmpeg developers 
    built on Nov 22 2014 17:07:19 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) 
    configuration: --prefix=/usr --extra-version='1ubuntu1~trusty6' --build-suffix=-ffmpeg --toolchain=hardened --extra-cflags= --extra-cxxflags= --libdir=/usr/lib/x86_64-linux-gnu --shlibdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --enable-shared --disable-stripping --enable-avresample --enable-avisynth --enable-fontconfig --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-opengl --enable-x11grab --enable-libxvid --enable-libx265 --enable-libdc1394 --enable-libiec61883 --enable-libzvbi --enable-libzmq --enable-frei0r --enable-libx264 --enable-libsoxr --enable-openal --enable-libopencv 
    libavutil  54. 7.100/54. 7.100 
    libavcodec  56. 1.100/56. 1.100 
    libavformat 56. 4.101/56. 4.101 
    libavdevice 56. 0.100/56. 0.100 
    libavfilter  5. 1.100/5. 1.100 
    libavresample 2. 1. 0/2. 1. 0 
    libswscale  3. 0.100/3. 0.100 
    libswresample 1. 1.100/1. 1.100 
    libpostproc 53. 0.100/53. 0.100 
Hyper fast Audio and Video encoder 
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 

これは私のffmpegの情報です。

これはffmpegのを実行するコードのブロックです:

try 
{ 
    ProcessBuilder procBuilder = null; 


    String sArgs = String.format("ffmpeg -i %s -vf scale=%s:%s -ab 128k -c:a aac -movflags faststart -strict -2 -ar 22050 -r 24 -c:v libx264 -crf 25 -y %s", 
       originalPath, 
       outWidth, 
       outHeight, 
       targetPath 
     ); 

    } 

    String[] arrArgs = sArgs.split("\\s+"); 
    procBuilder = new ProcessBuilder(Arrays.asList(arrArgs)); 
    procBuilder.redirectErrorStream(true); 
    procBuilder.redirectOutput(); 


    Process process = procBuilder.start(); 

    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) 
    { 
     String line = null; 
     while ((line = reader.readLine()) != null) 
     { 
      System.out.println(line); 
     } 
     errorCode = process.waitFor(); 
    } 
} 
catch(Throwable ex) 
{ 
} 

私は現在、5つのスレッドを産卵していて、各スレッドは、単一のビデオファイルをターゲットのffmpegの単一のインスタンスを実行します。ほとんどの場合、これは大丈夫ですが、スレッドがハングすることがあります。私は、ffmpegがコアCPUの100%を使用しているスレッドの1つを使っていくつかのファイルに無期限にハングアップすることに気付きました。 mkv、avi、wmv、mp4ファイルで気づいたように、さまざまなファイルタイプが発生しました。

ffmpegがハングする原因はわかりませんが、トランスコードプロセスの開始時に発生することはありません.ffmpegはファイルの変換を開始しますが、途中で止まってしまいます。

これは、同じファイルで同じコマンドを手動でうまく実行しようとすると問題はありません。それは、私が今では1つのスレッドのみを実行するようにサービスを変更したときに、同時に実行されているffmpegの複数のインスタンスが存在し、問題なしでほぼ​​1ヶ月間実行されている場合に発生するようです。

ffmpegの複数のインスタンスを同時に実行できるようにするために必要なオプションがありますか?これは私が現在使用しているコマンドラインの何かですか?

+0

したがって、8つのコア(実際のコア)がありますか?あなたはどうやって再びハングアップするのですか?各ターゲットファイルのディスクアクティビティを監視できますか? ffmpegがstderrに多く書き込むので、エラーストリームを出力ストリームにリダイレクトする必要があります。そうしないと、多くの情報が失われます。 – UmNyobe

+0

@UmNyobeはいstderrのリダイレクトも試みましたが、ffmpegは出力を書きません。私が初めて気づいたのは、私のサービスがファイルを処理するのをやめたことです。トランスコードされたファイルを保存する出力ディレクトリを確認したところ、ファイルが変更されていないことに気付きました。また、上から、ffmpegを実行する5つのプロセスがあることがわかりました。各プロセスは約20以上のスレッドを生成し、そのうちの1つだけが100%のCPUを使用していました。私はそれを約1時間走らせて戻ってきましたが、それでも出力ファイルのサイズは同じで、同じ正確なスレッドは100%のCPUを使用していました –

+0

@UmNyobe私は 'シングルスレッド'各ffmpegプロセスが100%CPUで実行されている単一のスレッドを持っていることを意味しました –

答えて

1

libx264は、デフォルトで、1.5 *論理コア(フレームベースのマルチスレッド)に等しい数のスレッドを使用します。これを5つのインスタンスに掛け合わせると、多くのスレッドが発生します。これはビデオストリームをエンコードするためのものです。

-x264opts threads=nオプションを設定すると、各インスタンスで使用されるスレッドの数を減らすことができます。

+0

そしてそれは何を達成するだろうか? –

+0

これらのスレッドはCPUを大量に使用します。デフォルトの設定は1つのコマンドでは機能するかもしれませんが、複数のインスタンスを実行しているので高いCPU要求が発生しています。個々のスレッド数を減らすと、デッドロックを回避しながら複数のインスタンスを実行するのに役立ちます。 CPUが多すぎると、あまりにも多くのスレッドがCPUを待つだけなので、パフォーマンスを見るにはベンチマークが必要です。 – aergistal

+0

いいえに基づくスレッド構成。のCPUコアのhttp://stackoverflow.com/questions/13834692/threads-configuration-based-on-no-of-cpu-cores – aergistal

関連する問題