Was Sie tun, ist, wie der Titel sagt, aber der Inhalt handelt hauptsächlich von der Verwendung von "Jackson".
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.
Das Ergebnis des Anrufs ist wie folgt (es ist lang, also falten Sie es).
{
"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"
}
}
]
}
Ich werde das Sondenergebnis, das ich zuvor erhalten habe, dem Objekt zuordnen. Die Ausgabe ist ein Array von Streams im Video.
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;
}
}
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)
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