[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu

Was Sie tun, ist, wie der Titel sagt, aber der Inhalt handelt hauptsächlich von der Verwendung von "Jackson".

ffprobe Optionsspezifikation

ffprobe funktioniert wie folgt.

cat ${Dateiname} | ffprobe -hide_banner -v error -print_format json -show_streams  -i pipe:0

Ich habe verschiedene Dinge spezifiziert, aber die folgenden zwei Punkte sind wichtig.

---print_format json-> Ausgabeverarbeitungsergebnis im JSON-Format ---show_streams-> Gibt alle Stream-Informationen wie Ton, Video, Untertitel usw. aus.

Weitere Informationen zum Aufrufen von Java finden Sie im folgenden Artikel.

Ergebnis aufrufen

Das Ergebnis des Anrufs ist wie folgt (es ist lang, also falten Sie es).

Aufrufergebnis
{
    "streams": [
        {
            "index": 0,
            "codec_name": "h264",
            "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
            "profile": "Main",
            "codec_type": "video",
            "codec_time_base": "752/45075",
            "codec_tag_string": "avc1",
            "codec_tag": "0x31637661",
            "width": 1920,
            "height": 1080,
            "coded_width": 1920,
            "coded_height": 1088,
            "has_b_frames": 1,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "16:9",
            "pix_fmt": "yuv420p",
            "level": 41,
            "color_range": "tv",
            "chroma_location": "left",
            "refs": 1,
            "is_avc": "true",
            "nal_length_size": "4",
            "r_frame_rate": "30000/1001",
            "avg_frame_rate": "45075/1504",
            "time_base": "1/30000",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 601600,
            "duration": "20.053333",
            "bit_rate": "6653705",
            "bits_per_raw_sample": "8",
            "nb_frames": "601",
            "disposition": {
                "default": 1,
                "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
            },
            "tags": {
                "creation_time": "2014-03-30T07:09:03.000000Z",
                "language": "eng",
                "handler_name": "\u001fMainconcept Video Media Handler",
                "encoder": "AVC Coding"
            }
        },
        {
            "index": 1,
            "codec_name": "aac",
            "codec_long_name": "AAC (Advanced Audio Coding)",
            "profile": "LC",
            "codec_type": "audio",
            "codec_time_base": "1/48000",
            "codec_tag_string": "mp4a",
            "codec_tag": "0x6134706d",
            "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/48000",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 962560,
            "duration": "20.053333",
            "bit_rate": "317375",
            "max_bit_rate": "317625",
            "nb_frames": "942",
            "disposition": {
                "default": 1,
                "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
            },
            "tags": {
                "creation_time": "2014-03-30T07:09:03.000000Z",
                "language": "eng",
                "handler_name": "#Mainconcept MP4 Sound Media Handler"
            }
        }
    ]
}

Karte von Jackson

Ich werde das Sondenergebnis, das ich zuvor erhalten habe, dem Objekt zuordnen. Die Ausgabe ist ein Array von Streams im Video.

Zielobjekt zuordnen

Dieses Mal werden wir den folgenden Objekten zugeordnet (@ Getter und @ Setter werden unter der Annahme von lombok geschrieben). Die Basis des Ergebnisses ist "Stream", und die Typen werden durch "Video" oder "Audio" (oder andere) getrennt.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "codec_type", defaultImpl = NoClass.class)
@JsonSubTypes({
        @JsonSubTypes.Type(value = FfprobeStream.VideoStream.class, name = "video"),
        @JsonSubTypes.Type(value = FfprobeStream.AudioStream.class, name = "audio")
})
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter @Setter
abstract class FfprobeStream {
    private Double duration;
    private String codecName;

    @Getter @Setter
    static class VideoStream extends FfprobeStream {
        private Integer width;
        private Integer height;
    }

    @Getter @Setter
    static class AudioStream extends FfprobeStream {
        private String channelLayout;
    }
}

Kommentar

In der folgenden Anmerkung wird der Typ des Kartenziels durch den Wert von "codec_type" gesteuert. Es gibt keine Möglichkeit, ein Gottobjekt zu erstellen und dort abzubilden, aber es ist einfacher, den Rest zu erledigen, daher ist es besser, den Typ des Kartenziels zu steuern.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "codec_type", defaultImpl = NoClass.class)
@JsonSubTypes({
        @JsonSubTypes.Type(value = FfprobeStream.VideoStream.class, name = "video"),
        @JsonSubTypes.Type(value = FfprobeStream.AudioStream.class, name = "audio")
})

Die folgenden Anmerkungen ignorieren Felder, die nicht zugeordnet werden können. Dieses Mal werden nur einige Felder des Ergebnisses vorbereitet. Wenn Sie dies nicht angeben, wird eine Fehlermeldung angezeigt, wenn Sie keine Zuordnung vornehmen können.

@JsonIgnoreProperties(ignoreUnknown = true)

Zuordnung von der Prüfergebniszeichenfolge zum Stream-Array

Sie können die Testergebnisse mit dem folgenden Code einem Array von Streams in Ihrem Video zuordnen. Details sind wie kommentiert.

static List<FfprobeStream> parseFfprobeResult(String ffprobeResult) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    //ffprobe gibt die Property Naming Strategy aus.SNAKE_Da es sich um einen JSON von CASE handelt, geben Sie ihn als solchen an
    mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

    // JSON ->Konvertierung von Java-Objekten implementiert
    Map<String, List<FfprobeStream>> map
            = mapper.readValue(ffprobeResult, new TypeReference<Map<String, List<FfprobeStream>>>() {});

    //Da das Analyseergebnis in Map angezeigt wird, rufen Sie es ab und geben Sie es zurück, indem Sie den Parameter angeben
    return map.getOrDefault("streams", Collections.emptyList());
}

Recommended Posts

[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
So ermitteln Sie die Länge einer Audiodatei mit Java
So erhöhen Sie den Wert von Map in einer Zeile in Java
Stellen Sie die Sensorinformationen von Raspberry Pi in Java grafisch dar und überprüfen Sie sie mit einem Webbrowser
Holen Sie sich das Ergebnis von POST in Java
Ausgabe des Buches "Einführung in Java"
JSON in Java und Jackson Teil ③ Betten Sie JSON in HTML ein und verwenden Sie es aus JavaScript
Beispielcode zum Serialisieren und Deserialisieren von Java Enum-Enumerationen und JSON in Jackson
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
Im kostenlosen Kurs von RubyOnRails Udemy ist ein Fehler aufgetreten, der behoben und bis zum Ende durchgearbeitet wurde
Ich habe die Daten der Reise (Tagebuchanwendung) in Java erhalten und versucht, sie # 001 zu visualisieren
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
Stellen Sie sicher, dass der JSON des Schlangenfalls dem Feld des Kamelfalls in Java (JVM) entspricht.
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Bedingte Verzweigung des Ergebnisses einer SQL-Anweisung, die nur eine in Java durchsucht
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!
[Java] So erhalten Sie den Schlüssel und den Wert, die in Map gespeichert sind, durch iterative Verarbeitung
Verwendung von git mit der Leistung von jgit in einer Umgebung ohne git-Befehle
[Ruby] Unterschied zwischen get und post
Holen Sie sich das Ergebnis von POST in Java
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Konvertieren Sie JSON und YAML in Java (mit Jackson und SnakeYAML)
Konvertieren Sie Java Enum Enumeration und JSON von und nach Jackson
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
[Java] Konvertieren Sie JSON in Java und Java in JSON-How to use GSON and Jackson-
[Memo] Die mysteriöse Bewegung meines Batis, setzen Sie null auf das Element des Listenobjekts und geben Sie es zurück.
Ein Programm (Java), das die Summe von ungeraden und geraden Zahlen in einem Array ausgibt
In Java 2D-Karte speichern und mit for-Anweisung drehen
[Hinweis] Java Ausgabe der Summe von ungeraden und geraden Elementen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
Initialisierung mit einer leeren Zeichenfolge für eine Instanz vom Typ Java-Zeichenfolge
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
So leiten Sie den letzten Tag des Monats in Java ab
[Java] JSON-Kommunikation mit Jackson
[Rails] Erhalten Sie access_token zum Zeitpunkt der Twitter-Authentifizierung mit Sorcery und speichern Sie es in der Datenbank
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)
Konvertieren Sie Excel mit Java in Blob, speichern Sie es, lesen Sie es aus der Datenbank und geben Sie es als Datei aus!
Lesen Sie die Daten der Shizuoka Prefecture Point Cloud DB mit Java und versuchen Sie, die Baumhöhe zu ermitteln.
Generieren Sie mit TableGenerator of Hibernate (JPA) eine Seriennummer und speichern Sie diese in der ID von String.
[Java] Verschiedene Zusammenfassungen an die Leiter von Klassen und Mitgliedern
Es reagiert nicht auf die Beschreibung in .js der Packs-Datei
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Die Geschichte von toString () beginnt mit der Übergabe eines Arrays an System.out.println
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Verwandeln Sie ein Array von Strings in eine Liste von Ganzzahlen in Java
Lesen Sie die ersten 4 Bytes der Java-Klassendatei und geben Sie CAFEBABE aus