【问题标题】:FFmpeg - calculate the remaining conversion timeFFmpeg - 计算剩余转换时间
【发布时间】:2018-10-19 23:04:48
【问题描述】:

例如,我使用 ffmpeg 将剪辑 video.mp4 转换为 video.mp3。 有没有办法计算剩余转化时间?

【问题讨论】:

  • 没有。如果知道输出的持续时间,可以计算( total duration - processed duration ) / current speed,但这在逻辑上是不合理的。
  • 当然,基于输入文件的大小和消耗它们的速率的估计是一个很好的估计。考虑输出端是没有意义的。

标签: video ffmpeg converter


【解决方案1】:

这是我从其他页面复制的工作逻辑,并将其修改为在匹配器尝试查找速度模式时不抛出异常,还删除了不必要的分配并进行了更动态的 toTimer 转换。当然,我已经测试了自己,所以一切都很好。

public String getRemainingTime(String message, long videoLengthInMillis) {
    Pattern pattern = Pattern.compile("time=([\\d\\w:]{8}[\\w.][\\d]+)");
    if (message.contains("speed")) {
        Matcher matcher = pattern.matcher(message);
        @SuppressWarnings("UnusedAssignment")
        String tempTime = "";
        if (matcher.find()) {
            tempTime = String.valueOf(matcher.group(1));
            String[] arrayTime = tempTime.split("[:|.]");
            long time =
                    TimeUnit.HOURS.toMillis(Long.parseLong(arrayTime[0])) +
                            TimeUnit.MINUTES.toMillis(Long.parseLong(arrayTime[1])) +
                            TimeUnit.SECONDS.toMillis(Long.parseLong(arrayTime[2])) +
                            Math.round(Long.parseLong(arrayTime[3]));
            String speed = message.substring(message.indexOf("speed=") + 1, message.indexOf("x")).split("=")[1];
            long eta = Math.round((Math.round(videoLengthInMillis) - time) / Float.valueOf(speed));
            String estimatedTime = toTimer(eta);
            Log.d("getRemainingTime", "EstimateTime -> " + estimatedTime);
            return estimatedTime;
        }
    }
    return "";
}
private String toTimer(long millis) {
    long hours = TimeUnit.MILLISECONDS.toHours(millis);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) -
            TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis));
    long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) -
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis));
    if (hours!= 0 && hours>0)
        return String.format(Locale.getDefault(), "%02d:%02d:%02d",hours,minutes,seconds);
    else
        return String.format(Locale.getDefault(), "%02d:%02d",minutes,seconds);
}

在 FFmpeg onProgress 回调中使用它:

@Override
public void onProgress(String message) {
    String remainingTime = getRemainingTime(message,yourVideoDurationInMilliseconds);
    Log.d("onProgress", "Remaining Time: "+remainingTime);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2018-05-18
    • 2017-05-14
    相关资源
    最近更新 更多