如何使用FFmpeg进行多线程处理?

3
我正在尝试分割、转换和合并音频。我使用了writingMinds为Android构建的FFmpeg。但对于长时间的音频,它需要太长时间。
为了加速,我尝试在一部有8个核心的手机上使用“线程-4”命令,但没有改善性能。
所以我将音频分成4部分(使用4个线程),然后在多线程中调用FFmpeg.execute()。但是FFmpeg库会按顺序处理文件。是否可能让ffmpeg在4个线程中并行处理这4个部分?如果可以,怎么做? 更新
请参见alex cohn's answer。 在这种情况下,这也是由于FFmpegExecuteAsyncTask的调用方法,因为Asynctask类的execute方法在现代API中只允许同时运行一个实例。 解决方法是使用这些检查。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Android 3.0 to
                    // Android 4.3
                    // Parallel AsyncTasks are not possible unless using executeOnExecutor
                    ffmpegExecuteAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                } else { // Below Android 3.0
                    // Parallel AsyncTasks are possible, with fixed thread-pool size
                    ffmpegExecuteAsyncTask.execute();
                }
1个回答

2

你说得对。这个Java包装器确保所有对ffmpeg的调用都是顺序的。如果你放弃这个包装器并自己加载二进制文件,你可以同时运行多个ffmpeg进程。请注意,它们不是线程,而是完整的进程,因此这样做的成本可能会高于你的预期。


谢谢您的评论,它解释了很多问题。但在我的情况下,这也是由于FFmpegExecuteAsyncTask的调用方法,因为Asynctask类的execute方法在现代API中只允许同时运行一个实例。 一种解决方法是使用这些检查。 - priojeet priyom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接