Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Kotlin] Problema con FFmpeg e FFprobe

    ciao!

    sto cercando di usare la libreria ffmpeg java per estrarre i metadati dai video: https://github.com/bramp/ffmpeg-cli-wrapper

    codice:
    fun getVideo() {
        val folder = "/run/media/fermat/DATI/Film/"
        var cntTot = 0
    
        File(folder)
            .walk()
            .sortedBy { it.name }
            .forEach {
                if (it.isFile) {
                    cntTot++
    
                    val ffprobe = FFprobe("/usr/bin/ffprobe");
                    val probeResult = ffprobe.probe(it.absolutePath.replace("\\u0020", "%20"))
    
                    println("---------")
                }
            }
    }
    praticamente ottengo questo errore:
    codice:
    Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected an int but was 715346611889696927 at line 187 column 37 path $.chapters[0].id
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:242)
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:232)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:130)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:221)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:130)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:221)
        at com.google.gson.Gson.fromJson(Gson.java:991)
        at com.google.gson.Gson.fromJson(Gson.java:929)
        at net.bramp.ffmpeg.FFprobe.probe(FFprobe.java:110)
        at net.bramp.ffmpeg.FFprobe.probe(FFprobe.java:47)
        at MainKt.getVideo(Main.kt:118)
        at MainKt.main(Main.kt:13)
    Caused by: java.lang.NumberFormatException: Expected an int but was 715346611889696927 at line 187 column 37 path $.chapters[0].id
        at com.google.gson.stream.JsonReader.nextInt(JsonReader.java:1172)
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:240)
        ... 14 more
    però sinceramente non ho capito come gestirlo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected an int but was 715346611889696927 at line 187 column 37 path $.chapters[0].id
    at com.google.gson.internal.bind.TypeAdapters$7.read( TypeAdapters.java:242)
    at com.google.gson.internal.bind.TypeAdapters$7.read( TypeAdapters.java:232)
    at com.google.gson.internal.bind.ReflectiveTypeAdapte rFactory$1.read(ReflectiveTypeAdapterFactory.java: 130)
    at com.google.gson.internal.bind.ReflectiveTypeAdapte rFactory$Adapter.read(ReflectiveTypeAdapterFactory .java:221)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTy peWrapper.read(TypeAdapterRuntimeTypeWrapper.java: 41)
    at com.google.gson.internal.bind.CollectionTypeAdapte rFactory$Adapter.read(CollectionTypeAdapterFactory .java:82)
    at com.google.gson.internal.bind.CollectionTypeAdapte rFactory$Adapter.read(CollectionTypeAdapterFactory .java:61)
    at com.google.gson.internal.bind.ReflectiveTypeAdapte rFactory$1.read(ReflectiveTypeAdapterFactory.java: 130)
    at com.google.gson.internal.bind.ReflectiveTypeAdapte rFactory$Adapter.read(ReflectiveTypeAdapterFactory .java:221)
    at com.google.gson.Gson.fromJson(Gson.java:991)
    at com.google.gson.Gson.fromJson(Gson.java:929)
    at net.bramp.ffmpeg.FFprobe.probe(FFprobe.java:110)
    at net.bramp.ffmpeg.FFprobe.probe(FFprobe.java:47)
    at MainKt.getVideo(Main.kt:118)
    at MainKt.main(Main.kt:13)
    Premesso che NON conosco bene il contesto. Ma qualcosa sono riuscito comunque a capire. Questo artifact ffmpeg usa la "famosa" Google Gson per parsare un documento JSON.
    Guardando il sorgente di FFprobe, che si trova qui: https://github.com/bramp/ffmpeg-cli-...g/FFprobe.java

    si vede bene che il probe() fa nient'altro che avviare un processo del ffprobe e legge il JSON prodotto su standard-output.

    Se guardi la riga 110 di FFprobe.java (che è quella dove ti si pianta):
    codice:
    FFmpegProbeResult result = gson.fromJson(reader, FFmpegProbeResult.class);

    Ovvero fa il parsing del JSON (dal reader che incapsula lo standard-output) usando come "modello" la classe FFmpegProbeResult).

    Ora, ripeto, non conosco il contesto. Ma le cose sono (almeno) due: o quel JSON è "sballato", oppure l'artifact ffmpeg (e quindi la classe FFmpegProbeResult) non è aggiornato/appropriato per gestire quel tipo di JSON.

    Pertanto, dato che si tratta dell'avvio di un processo, io lancerei "a mano" il ffprobe (usando gli stessi argomenti che passa il probe() ) e guarderei bene il JSON in output. Poi si può eventualmente cercare della documentazione. Quel JSON ha un formato che segue un qualche standard ben preciso? Esiste della documentazione a riguardo??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao!

    grazie per la risposta!

    allora, penso che il problema sia su questo file:
    codice:
    $ ffprobe -print_format json -show_error -show_format -show_streams -show_chapters '/run/media/fermat/DATI/Film/Disney/Anastasia.avi' > file.json
    ffprobe version n5.1.2 Copyright (c) 2007-2022 the FFmpeg developers
      built with gcc 12.2.0 (GCC)
      configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-opencl --enable-opengl --enable-shared --enable-version3 --enable-vulkan
      libavutil      57. 28.100 / 57. 28.100
      libavcodec     59. 37.100 / 59. 37.100
      libavformat    59. 27.100 / 59. 27.100
      libavdevice    59.  7.100 / 59.  7.100
      libavfilter     8. 44.100 /  8. 44.100
      libswscale      6.  7.100 /  6.  7.100
      libswresample   4.  7.100 /  4.  7.100
      libpostproc    56.  6.100 / 56.  6.100
    [mpeg4 @ 0x563e6e27b040] looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag
    Input #0, avi, from '/run/media/fermat/DATI/Film/Disney/Anastasia.avi':
      Duration: 01:30:17.30, start: 0.000000, bitrate: 1059 kb/s
      Stream #0:0: Video: mpeg4 (DIVX / 0x58564944), yuv420p, 720x288, 919 kb/s, 20 fps, 20 tbr, 20 tbn
      Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, fltp, 128 kb/s
    qui non mi restituisce nessun json infatti.
    mentre nel file che viene processato subito priima, ottengo un json completo.

    quindi probabilmente ffprobe non riesce a fare il suo dovere.

    PS: io stavo cercando di usare questa libreria, ma ne va bene una qualsiasi, devo solo estrarre alcuni metadati dai video.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    $ ffprobe -print_format json -show_error -show_format -show_streams -show_chapters '/run/media/fermat/DATI/Film/Disney/Anastasia.avi' > file.json
    Lo standard-output lo hai rediretto su file. Quindi è vuoto o che altro?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ah si scusa, mi sono dimenticato di postarlo.

    non è vuoto, ma ha molte meno info di un altro video:
    codice:
    {
        "streams": [
            {
                "index": 0,
                "codec_name": "mpeg4",
                "codec_long_name": "MPEG-4 part 2",
                "codec_type": "video",
                "codec_tag_string": "DIVX",
                "codec_tag": "0x58564944",
                "width": 720,
                "height": 288,
                "coded_width": 720,
                "coded_height": 288,
                "closed_captions": 0,
                "film_grain": 0,
                "has_b_frames": 1,
                "pix_fmt": "yuv420p",
                "level": -99,
                "chroma_location": "left",
                "refs": 1,
                "quarter_sample": "false",
                "divx_packed": "false",
                "r_frame_rate": "20/1",
                "avg_frame_rate": "20/1",
                "time_base": "1/20",
                "start_pts": 0,
                "start_time": "0.000000",
                "duration_ts": 108346,
                "duration": "5417.300000",
                "bit_rate": "919913",
                "nb_frames": "108346",
                "extradata_size": 19,
                "disposition": {
                    "default": 0,
                    "dub": 0,
                    "original": 0,
                    "comment": 0,
                    "lyrics": 0,
                    "karaoke": 0,
                    "forced": 0,
                    "hearing_impaired": 0,
                    "visual_impaired": 0,
                    "clean_effects": 0,
                    "attached_pic": 0,
                    "timed_thumbnails": 0,
                    "captions": 0,
                    "descriptions": 0,
                    "metadata": 0,
                    "dependent": 0,
                    "still_image": 0
                }
            },
            {
                "index": 1,
                "codec_name": "mp3",
                "codec_long_name": "MP3 (MPEG audio layer 3)",
                "codec_type": "audio",
                "codec_tag_string": "U[0][0][0]",
                "codec_tag": "0x0055",
                "sample_fmt": "fltp",
                "sample_rate": "48000",
                "channels": 2,
                "channel_layout": "stereo",
                "bits_per_sample": 0,
                "r_frame_rate": "0/0",
                "avg_frame_rate": "0/0",
                "time_base": "1/16000",
                "start_pts": 0,
                "start_time": "0.000000",
                "bit_rate": "128000",
                "nb_frames": "225716",
                "extradata_size": 12,
                "disposition": {
                    "default": 0,
                    "dub": 0,
                    "original": 0,
                    "comment": 0,
                    "lyrics": 0,
                    "karaoke": 0,
                    "forced": 0,
                    "hearing_impaired": 0,
                    "visual_impaired": 0,
                    "clean_effects": 0,
                    "attached_pic": 0,
                    "timed_thumbnails": 0,
                    "captions": 0,
                    "descriptions": 0,
                    "metadata": 0,
                    "dependent": 0,
                    "still_image": 0
                }
            }
        ],
        "chapters": [
    
        ],
        "format": {
            "filename": "/run/media/fermat/DATI/Film/Disney/Anastasia.avi",
            "nb_streams": 2,
            "nb_programs": 0,
            "format_name": "avi",
            "format_long_name": "AVI (Audio Video Interleaved)",
            "start_time": "0.000000",
            "duration": "5417.300000",
            "size": "717785950",
            "bit_rate": "1059990",
            "probe_score": 100
        }
    }
    invece un video che non da problemi: https://pastebin.com/AFwR3Zhi

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    non è vuoto, ma ha molte meno info di un altro video:
    E questo però che problemi dà? Perché dal JSON risulta che il "chapters" è un array vuoto.

    Il problema che hai esposto prima diceva: Expected an int but was 715346611889696927 at line 187 column 37 path $.chapters[0].id

    Ovvero era un problema il fatto di avere un oggetto chapter con un id es. 715346611889696927, perché nella definizione di FFmpegChapter, il id è appunto un int.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    no scusa, adesso ho capito qual'è.
    si fermava a quello, ma non era quello.

    qui il pastebin: https://pastebin.com/fyk0qHDb

    ed in effetti ha quell'id!

  8. #8
    al momento penso farò così:
    codice:
    fun getVideo() {
        val folder = "/run/media/fermat/DATI/Film/"
        var cntTot = 0
    
        File(folder)
            .walk()
            .sortedBy { it.name }
            .forEach {
                if (it.isFile) {
                    try {
                        cntTot++
    
                        println(it.name)
    
                        val ffprobe = FFprobe("/usr/bin/ffprobe");
                        val probeResult = ffprobe.probe(it.absolutePath)
    
                        val format: FFmpegFormat = probeResult.getFormat()
                        println(format.format_long_name)
                        println(format.duration)
                        println(format.size)
    
                        println("---------")
                    } catch (ex: Exception) {
                    }
    
                }
    
                if (cntTot == 2) {
                    exitProcess(0)
                }
            }
    
        println("==========")
        println("Totale video: $cntTot")
    }
    se va in eccezione lo salto e registro solo il nome del film.
    poi vedo se è una cosa risolvibile o se ci sono altre librerie per fare la stessa cosa!


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.