さまざまな形式の大量のビデオをトランスコードする必要があるサービスがあります。サービスは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の複数のインスタンスを同時に実行できるようにするために必要なオプションがありますか?これは私が現在使用しているコマンドラインの何かですか?
したがって、8つのコア(実際のコア)がありますか?あなたはどうやって再びハングアップするのですか?各ターゲットファイルのディスクアクティビティを監視できますか? ffmpegがstderrに多く書き込むので、エラーストリームを出力ストリームにリダイレクトする必要があります。そうしないと、多くの情報が失われます。 – UmNyobe
@UmNyobeはいstderrのリダイレクトも試みましたが、ffmpegは出力を書きません。私が初めて気づいたのは、私のサービスがファイルを処理するのをやめたことです。トランスコードされたファイルを保存する出力ディレクトリを確認したところ、ファイルが変更されていないことに気付きました。また、上から、ffmpegを実行する5つのプロセスがあることがわかりました。各プロセスは約20以上のスレッドを生成し、そのうちの1つだけが100%のCPUを使用していました。私はそれを約1時間走らせて戻ってきましたが、それでも出力ファイルのサイズは同じで、同じ正確なスレッドは100%のCPUを使用していました –
@UmNyobe私は 'シングルスレッド'各ffmpegプロセスが100%CPUで実行されている単一のスレッドを持っていることを意味しました –