Reputation: 4775
I have a service that needs to transcode large amount of videos with different formats. The service spawns five threads, one for a single video and each thread runs ffmpeg with the following command:
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%%
where X and Y are the desired dimensions based on the orientation of the original file basically its either 640:trunc(ow*a/2)*2
for landscape or trunc(oh*a/2)*2:640
for portrait.
This is my ffmpeg info:
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}...
The service is written in Java and running on Ubuntu Server 14.04 and the machine is an 64-bit octa-core server.
This is the code block that executes 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)
{
}
I am currently spawning five threads, and each thread runs a single instance of ffmpeg targeting a single video file. This works fine most of the time, but every once in a while threads start to hang. I noticed from top that ffmpeg hangs indefinitely on some files with one of the threads using 100% of the core CPU and no progress is made. It happened with different file types as I noticed this on mkv, avi, wmv and mp4 files.
I am not sure what is causing ffmpeg to hang, it does not happen right at the beginning of the transcoding process, ffmpeg starts converting the file fine but somewhere in the middle it gets stuck.
Now this is not a problem with the files as when I try the same command on the same file manually it runs fine. And it only seems to happen when there are multiple instances of ffmpeg running at the same time as I now changed my service to only run a single thread and it has been running for almost a month with no issues.
Is there an option that I need to use to allow multiple instances of ffmpeg to run at the same time? Is it something in the command line that I currently use that causes this?
Upvotes: 0
Views: 3543
Reputation: 31209
libx264
uses by default a number of threads equal to 1.5 * logical cores (for frame-based multi-threading). Multiply this with five instances and you get a lot of threads, and this is just for encoding the video stream.
You can try reducing the number of threads used on each instance by setting the -x264opts threads=n
option.
Upvotes: 1