Estrarre metadata dai video in Kotlin e ffmpeg-cli-wrapper

Mattepuffo's logo
Estrarre metadata dai video in Kotlin e ffmpeg-cli-wrapper

Estrarre metadata dai video in Kotlin e ffmpeg-cli-wrapper

FFmpeg lo conosciamo tutti penso; ffmpeg-cli-wrapper è un wrapper per Java, che noi useremo in Kotlin per estrarre metadata dai video!

La prima cosa da fare è installare FFmpeg sul proprio sistema; essendo un wrapper, ha la necessità di avere il programma installato.

Poi, se usate Maven:

        <dependency>
            <groupId>net.bramp.ffmpeg</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>0.7.0</version>
        </dependency>

Detto ciò un pò di codice:

package com.mp.multimedia

import net.bramp.ffmpeg.FFprobe
import net.bramp.ffmpeg.probe.FFmpegFormat
import java.io.File
import java.text.DecimalFormat
import java.time.LocalTime
import java.time.format.DateTimeFormatter

fun main(args: Array<String>) {
    getVideo()
}

fun getVideo() {
    val df = DecimalFormat("0.00")
    val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

    println("==========")

    val folder = "/run/media/fermat/DATI/Film/"

    File(folder)
        .walk()
        .sortedBy { it.name }
        .forEach {
            if (it.isFile) {
                var formatLongName = ""
                var codecLongName = ""
                var size = 0.0
                var width = 0
                var height = 0
                var timeDuration = ""

                try {
                    val ffprobe = FFprobe("/usr/bin/ffprobe");
                    val probeResult = ffprobe.probe(it.absolutePath)

                    val format: FFmpegFormat = probeResult.getFormat()
                    val stream = probeResult.getStreams()[0]

                    val time: LocalTime = LocalTime.MIN.plusSeconds(format.duration.toLong())

                    timeDuration = formatter.format(time)
                    formatLongName = format.format_long_name
                    codecLongName = stream.codec_long_name
                    size = ((format.size / (1024.0 * 1024.0 * 1024.0)))
                    width = stream.width
                    height = stream.height
                } catch (ex: Exception) {
                }

                println(it.name)
                println(formatLongName)
                println(df.format(size))
                println(codecLongName)
                println(width)
                println(height)
                println(timeDuration)
                println("---------")
            }
        }

    println("==========")
}

Come vedete dobbiamo indicare dove si trova FFprobe, che viene installato insieme ad FFmpeg.

Ovviamente dipende dal sistema su cui lo installate.

Poi potete notare quel try/catch; in pratica su alcuni video ricevo un errore, che ho deciso di bypassare in attesa di trovare una soluzione.

Potete leggere su html.it la discussione al riguardo.

Enjoy!


Condividi

Commentami!