Audio- und Videoentwicklung – ffmpeg-Einführung – Serie eins

Inhaltsverzeichnis

1. Einleitung

Die Grundzusammensetzung des FFmpeg-Frameworks umfasst:

2. Das FFmpeg-Framework regelt den Audio- und VideoprozessBearbeiten

Basiskonzept:

3. Der Unterschied zwischen ffmpeg, ffplay und ffprobe

     4.1 ffmpeg ist eine Anwendung zur Transkodierung 

4.2 fffplay ist eine Anwendung zum Spielen 

     4.3 ffprobe ist eine Anwendung zum Anzeigen von Dateiformaten

     4.4 ffmpeg ist eine Anwendung zur Transkodierung 

  5. Gängige Dateiformate und Kodierungen

  5.1 Gängige Videoformate und Dateiformate

5.2 Gängige kodierte Audio-Transkodierungsformate

Sechstens kompilieren Sie das ffmepg-Skript

6.1 ffmpeg-Kerntools

6.2 Video konvertieren

 6.3 Zuschneiden transformieren

 6.3 Video-Stummschaltung

6.4 Wasserzeichen zum Video hinzufügen

 6.5 Änderung der Videogeschwindigkeit

6.6 Mosaik zum Video hinzufügen

6.7 Video-Screenshot

 6.8 Wasserzeichen zu Bildern hinzufügen

 6.9 Bildsynthesevideo


  • 1. Einleitung

 , Laden Sie die  offizielle Website-Adresse   von FFmpeg herunter.
Der vollständige Name von FFmpeg lautet Fast Forward Moving Picture Experts Group (mpeg: Moving Picture Experts Group), gegründet im Jahr 2000. Es handelt sich um ein kostenloses Open-Source-Audio- und Video-Codec-Tool und Entwicklungskit. Es ist leistungsstark und vielseitig und wird häufig auf Videoseiten und kommerzieller Software (wie YouTube und iTunes) verwendet.
FFmpeg selbst ist ein riesiges Projekt, das viele Komponenten und Bibliotheksdateien enthält. Das am häufigsten verwendete ist das Befehlszeilentool. FFmpeg ist nicht nur ein Audio- und Video-Codec-Tool, sondern auch eine Reihe von Audio- und Video-Codec-Entwicklungskits als Codec Development Kit, das Entwicklern eine umfangreiche Aufrufschnittstelle für die Audio- und Videoverarbeitung bietet . FFmpeg bietet die Kapselung und Entkapselung verschiedener Medienformate, einschließlich mehrerer Audio- und Videokodierungen, mehrerer Protokoll-Streaming-Medien, mehrerer Farbformatkonvertierungen, mehrerer Abtastratenkonvertierungen, mehrerer Coderatenkonvertierungen usw.; das FFmpeg-Framework bietet mehrere Eine Vielzahl von Plug-Ins in Modulen, einschließlich Plug-Ins zum Verpacken und Entkapseln, Plug-Ins zum Kodieren und Dekodieren usw.

FFmpeg ist eine sehr umfassende Bildverarbeitungssuite.

  1. Die Grundzusammensetzung des FFmpeg-Frameworks umfasst:

    Die Rolle jeder Funktionsbibliothek 

    libavcodec: Codec-Bibliothek. Unterstützt MPEG4, AAC, MJPEG und andere integrierte Medien-Codec-Formate usw. * Unterstützt Codecs von Drittanbietern: H.264 (AVC)-Kodierung, x264-Kodierung erforderlich; H.265 (HEVC)-Kodierung, x265 erforderlich Beim Codieren der MP3-Codierung (mp3lame) müssen Sie den libmp3lame-Encoder verwenden. Wenn Sie Ihr eigenes Codierungsformat oder Hardware-Codierung und -Decodierung hinzufügen möchten, müssen Sie das entsprechende Codierungs- und Decodierungsmodul in AVCodec hinzufügen

    libavformat: Kapselung und Analyse von Audio- und Video-Containerformaten und unterstützten Protokollen. Dateikapselungsformat: MP4, FLV, KV, TS usw. * Netzwerkprotokoll-Kapselungsformat: RTMP, RTSP, MMS, HLS usw.

    libavutil: Stellt einige öffentliche Funktionen und Toolbibliotheken bereit.

    libavfilter: Audio- und Videofilterbibliothek, z. B. Video-Wasserzeichen, Audio-Sprachänderung usw.

    libavdevice: Unterstützt die Eingabe und Ausgabe vieler Gerätedaten, z. B. das Lesen von Kameradaten und die Bildschirmaufzeichnung.

    libswresample, libavresample: Stellt Audio-Resampling-Tool-Bibliotheken bereit.

    libswscale: Bietet Farbkonvertierung, Skalierung und Pixelformatkonvertierung für Videobilder, z. B. YUV-Konvertierung von Bildern.

    libpostproc: Multimedia-Postprozessor.

  2. 2.  Der Prozess der Kombination von Audio und Video durch das FFmpeg-Framework

    Basiskonzept:

    Container (Container) Ein Container ist ein Dateiformat wie FLV, MKV usw. Enthält die folgenden 5 Streams und Dateiheaderinformationen.

    Stream (Stream) ist eine Übertragungsmethode für Videodateninformationen. Es gibt fünf Arten von Streams: Audio, Video, Untertitel, Anhänge und Daten.

    Frame (Frame) Frame stellt ein Standbild dar, unterteilt in I-Frame, P-Frame und B-Frame.

    Codec (Codec) dient zum Komprimieren oder Dekomprimieren von Videos, CODEC =Code (Kodierung) +DECode (Dekodierung)

    Multiplexing/Demultiplexing (Mux/Demux) Das Zusammenfügen verschiedener Streams in Container gemäß den Regeln eines bestimmten Containers wird als Multiplexing (Mux) bezeichnet. Das Parsen verschiedener Streams aus einem bestimmten Container wird als Demultiplexing (Demux) bezeichnet, sofern FFmpeg dies unterstützt Ein bestimmtes Medienverpackungsformat hängt davon ab, ob die Verpackungsbibliothek dieses Formats bei der Kompilierung einbezogen wird. Je nach tatsächlichem Bedarf kann das Medienverpackungsformat durch Hinzufügen Ihres eigenen benutzerdefinierten Verpackungsformats erweitert werden, dh durch Hinzufügen Ihres eigenen Verpackungsverarbeitungsmoduls in AVFormat

  3. 3. Der Unterschied zwischen ffmpeg, ffplay und ffprobe

     4.1 ffmpeg ist eine Anwendung zur Transkodierung 
     4.2 fffplay ist eine Anwendung zum Spielen 
     4.3 ffprobe ist eine Anwendung zum Anzeigen von Dateiformaten

  5. Gängige Dateiformate und Kodierungen

  5.1  Gängige Videoformate und Dateiformate

5.2  Gängige kodierte Audio-Transkodierungsformate

  • MP4-Paket: H264-Videokodierung + AAC-Audiokodierung (relativ ausgereift)

  • WebM-Paket: VP8-Videokodierung + Vorbis-Audiokodierung (Google-Lösung)

  • OGG-Paket: Theora-Videokodierung + Vorbis-Audiokodierung (Open Source)

Sechstens kompilieren Sie das ffmepg-Skript

#!/bin/bash
# 以下路径需要修改成自己的NDK目录
TOOLCHAIN=/Users/lh/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64
# 最低支持的android sdk版本
API=21

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
 --prefix=$PREFIX \
 --disable-shared \
 --enable-static \
 --disable-avdevice \
 --enable-small \
 --disable-muxers \
 --disable-filters \
 --enable-gpl \
 --cross-prefix=$CROSS_PREFIX \
 --target-os=android \
 --arch=$ARCH \
 --cpu=$CPU \
 --cc=$CC \
 --cxx=$CXX \
 --enable-cross-compile \
 --sysroot=$SYSROOT \
 --extra-cflags="-mno-stackrealign -Os $OPTIMIZE_CFLAGS -fPIC" \
 --extra-ldflags="$ADDI_LDFLAGS" \
 $ADDITIONAL_CONFIGURE_FLAG
make clean
make -j16
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

# armv8-a
ARCH=arm64
CPU=armv8-a
# r21版本的ndk中所有的编译器都在/toolchains/llvm/prebuilt/darwin-x86_64/目录下(clang)
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
# NDK头文件环境
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
# so输出路径
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

# 交叉编译工具目录,对应关系如下
# armv8a -> arm64 -> aarch64-linux-android-
# armv7a -> arm -> arm-linux-androideabi-
# x86 -> x86 -> i686-linux-android-
# x86_64 -> x86_64 -> x86_64-linux-android-

# CPU架构
# armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

 

Führen Sie ./buildsh.sh aus

Das Produkt nach erfolgreicher Kompilierung

6.1 ffmpeg-Kerntools

ffmpeg bietet die folgenden drei Tools

____ffmpeg # 用于音视频编解码等等
| |____ffplay # 用于播放音视频文件、流媒体数据等等
| |____ffprobe # 用于查看文件封装格式、音视频编码格式等等详细信息
# ffmpeg [全局参数] [[输入文件参数] -i 输入文件]... {[输出文件参数] 输出文件}...
$ ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

Holen Sie sich Videoinformationen

./ffmpeg -i /Users/lh/Downloads/test.mp4 

Dieser Informationsabschnitt gibt an, dass die Datei

Metadateninformationen:

Das Feld „major_brand“ gibt an, dass das Kapselungsformat der Datei mp42 ist (Unterstandard des MP4-Formats), die Dateierstellungszeit 2023-07-21T03:32:06.000000Z ist und die Videodauer 00:00:07.86 (71 Sekunden 86) beträgt ), mit der Wiedergabe beginnen. Die Zeit beträgt 0,000300 ms, die Bitrate der Datei beträgt 1457 kb/s

Die ersten Videoinformationen:

Bevor Sie diesen Teil der Informationen einführen, müssen Sie einige Fachbegriffe kennen, nämlich die Definition der Zeitbasis:

tbr gibt die Bildrate an, und dieser Parameter ist in der Regel ein Benchmark. Oft ist tbr dasselbe wie fps,
tbn gibt die Zeitbasis des Videostreams an. Beispielsweise beträgt die Zeitbasis des ts-Streams 90000 und die Zeitbasis von Der Videostream im FLV-Format beträgt 1000. 
TBC gibt die Zeitbasis des Videostream-Codecs an. Der Stream-Parameter für 264 Codes wird indirekt durch Parsen von SPs ermittelt (die Bildrate wird über SPS ermittelt). Dieser
Teil der Informationen gibt an, dass der erste Stream der Datei ist ist ein Videostream, die Kodierungsmethode ist das H264-Format, das Kapselungsformat ist AVC1 und das Datenformat des Frames ist yuv420p. Die Auflösung beträgt 480 x 640 und die Bitrate beträgt 1450 kb/s

6.2 Video konvertieren

Konvertieren Sie Videos im MP4-Format in das FLV-Format

./ffmpeg -i /Users/lh/Downloads/test.mp4 /Users/lh/Downloads/aaa.flv

Der spezifische Konvertierungsprozess ist unten aufgeführt

 6.3 Zuschneiden transformieren

./ffmpeg -ss 00:00:03 -i /Users/lh/Downloads/test.mp4 -vcodec copy -acodec copy -t 00:00:6 /Users/lh/Downloads/output.mp4

Schneiden Sie test.mp4 von der dritten bis zur sechsten Sekunde aus. Im Folgenden finden Sie den Schneidevorgang

 6.3 Video-Stummschaltung

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -af "volume=enable='between(t,5,10)':volume=0" /Users/lh/Downloads/output.mp4 

Beschreibung: Die Funktion dieses Befehls besteht darin, das 210710171112971120.mp4-Video entsprechend der angegebenen Zeit stummzuschalten und ein neues .mp4-Ausgabevideo zu generieren. volume=enable='between(t,5,10)':volume=0 Stummschaltung von der 5. bis zur 10. Sekunde. Mit diesem Befehl können mehrere Stummschaltungen geschrieben werden, die durch Kommas getrennt sind

6.4 Wasserzeichen zum Video hinzufügen

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -vf "movie=/Users/lh/Downloads/shuiyin.jpeg,colorchannelmixer=aa=0.4,scale=300:300 [watermark]; [in][ Wasserzeichen] Overlay“ /Users/lh/Downloads/output.mp4

veranschaulichen:

Die Funktion dieses Befehls besteht darin, das Video „input.mp4“ gemäß dem angegebenen Befehl mit einem Wasserzeichen zu versehen und ein neues Video „output.mp4“ zu generieren.

movie=input.png Wasserzeichenbild,

colorchannelmixer=aa=0.4 Wasserzeichentransparenz (wenn Sie die Transparenz nicht ändern müssen, entfernen Sie diesen Absatz)

scale=300:300 Die Größe des Wasserzeichens (wenn Sie die Originalgröße des Wasserzeichens verwenden, entfernen Sie diesen Abschnitt)

Overlay Die Position des Wasserzeichens, standardmäßig ist die obere linke Ecke

        overlay=Ww obere rechte Ecke

        overlay=0:Hh untere linke Ecke

        overlay=Ww:Hh untere rechte Ecke

ps: Wenn das Wasserzeichen nicht am Rand angezeigt werden muss, ändern Sie einfach die Werte von W und H leicht
 

So fügen Sie einem Video ein Wasserzeichen hinzu

 Wenn Sie es in der unteren linken Ecke platzieren möchten

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -vf "movie=/Users/lh/Downloads/shuiyin.jpeg,colorchannelmixer=aa=0.4,scale=300:300 [watermark]; [in][ Wasserzeichen] overlay=Ww:Hh" /Users/lh/Downloads/output.mp4

Effektbild unten

 6.5 Änderung der Videogeschwindigkeit

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v] " -map "[a]" /Users/lh/Downloads/output.mp4

veranschaulichen:

Die Funktion dieses Befehls besteht darin, das 210710171112971120.mp4-Video mit der angegebenen Geschwindigkeit zu konvertieren, um ein neues .mp4-Ausgabevideo zu generieren. setpts=0,5*PTS-Videobeschleunigung (der Standardwert ist 1, jetzt ist er 0,5. Es wird 2-mal schneller)

atempo=2,0 Audiobeschleunigung (der Standardwert ist 1, jetzt ist er 0,5. Es wird die 2-fache Geschwindigkeit)

PS: Videobeschleunigung und Audiobeschleunigung, die doppelte Geschwindigkeit muss konsistent sein, sonst sind Ton und Video nicht synchron

Tatsächlich entspricht dies der Wiedergabe von Videos mit einer Geschwindigkeit, die doppelt so hoch ist wie die Geschwindigkeit von Schnellvorlaufvideos. Beispielsweise sehen wir auf einigen Video-Websites oft die x1,2-, x1,5- und x2-fache Wiedergabe von Videos.

6.6 Mosaik zum Video hinzufügen

Wenn Sie einem Video oder Bild ein Mosaik hinzufügen müssen, können Sie  boxblur einen Filter verwenden. Dieser Filter verwandelt den angegebenen Bereich in einen Unschärfeeffekt, um einen Mosaikeffekt zu erzielen. Hier ist ein einfaches Beispiel:

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -filter_complex "[0:v]boxblur=10[blur];[blur]crop=200:200:300:300,boxblur=10[cropped]; [0:v][cropped]overlay=300:300" /Users/lh/Downloads/output.mp4 

veranschaulichen

Unter diesen bedeutet -i 210710171112971120.mp4 die Angabe der Eingabedatei. [0:v]boxblur=10[blur] bedeutet, das Videobild zu verwischen, der Unschärferadius beträgt 10 Pixel und wird als Zwischenvariable Unschärfe gespeichert. [blur]crop=200:200:300:300,boxblur=10[cropped] bedeutet, den unscharfen Videobildschirm zuzuschneiden und nur die obere linke Ecke mit den Startkoordinaten (300, 300) und den Bereich mit einer Breite beizubehalten und eine Höhe von 200. Und führen Sie die Fuzzy-Verarbeitung erneut durch und speichern Sie sie als beschnittene Zwischenvariable. Verwenden Sie abschließend den Overlay-Filter, um das Originalvideo und das zugeschnittene Mosaikbild zu überlagern und eine neue Videodatei „output.mp4“ zu generieren.

Wenn Sie Größe, Position, Form und andere Eigenschaften des Mosaiks anpassen müssen, können Sie verschiedene Parameter zur Einstellung hinzufügen.

Wenn das Wasserzeichen und das Mosaik im Video nicht mit Softwaretools entfernt werden können, können Sie versuchen, mit FFmpeg oder ähnlichen Tools weitere Ebenen zum Video hinzuzufügen, um diese Bereiche abzudecken

Das Folgende ist der Codierungseffekt
 

6.7 Video-Screenshot

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -y -f mjpeg -ss 30 -t 1 /Users/lh/Downloads/test1.jpg

veranschaulichen:

-f mjpeg gibt an, dass das formatierte Format mjpeg ist.

-ss 30 Beginnen Sie ab der 30. Sekunde mit dem Abfangen

-t 1 einen Frame erfassen

Der Effekt ist wie unten gezeigt

 6.8 Wasserzeichen zu Bildern hinzufügen

./ffmpeg -i /Users/lh/Downloads/test1.jpg -i /Users/lh/Downloads/shuiyin.jpeg -filter_complex "overlay=Ww-10:Hh-10:alpha=0.5" /Users/lh/Downloads /output.jpg

veranschaulichen:

Wobei  W und  H die Breite und Höhe des Videobilds w bzw.  h die Breite und Höhe des Wasserzeichenbilds darstellen. alpha=0.5 Gibt an, dass die Transparenz des Wasserzeichens auf 0,5 eingestellt wird

Der Effekt ist wie unten gezeigt 

 6.9 Bildsynthesevideo

/ffmpeg -i /Users/lh/Downloads/imgs/img_%1d.jpeg /Users/lh/Downloads/out.mp4

Führen Sie die 6 Bilder im Verzeichnis /Users/lh/Downloads/imgs/ zu einem Video zusammen

 Ausgabeergebnis:

6.10 Untertitel zum Video hinzufügen

Erstellen Sie zunächst die Untertiteldatei

Katze Winter.srt

1
00:00:01,000 --> 00:00:02,000
大家好,我是测试ffmepg的开发人员,这是第一条字幕

2
00:00:02,000 --> 00:00:05,000
本次我想和大家分享利用ffmpeg制作字幕的方法

3
00:00:05,000 --> 00:00:10,000
本次我想和大家分享利用ffmpeg制作字幕的方法

4
00:00:10,000 --> 00:00:20,000
本次我想和大家分享利用ffmpeg制作字幕的方法

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -lavfi "subtitles=/Users/lh/Downloads/zimu.srt :force_style='Alignment=2,MarginV=5'" -y /Users/lh/ Downloads/output.mp4 

Der Effekt ist wie folgt

6.11 Online-Video abspielen und den Fenstertitel als http-Stream festlegen

./ffplay -window_title „http-Stream“ http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4

Der Effekt ist wie folgt

6.12 ffplay spielt Netzwerkvideos ab und erzwingt den Decoder

./ffplay -vcodec h264 -window_title „http-Stream“ http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4

Erzwingen Sie, dass der Decoder h264 ist

Der Effekt ist wie folgt

6.13 ffplay spielt Netzwerkvideos ab und dreht Videos 

./ffplay -window_title „http-Stream“ http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -vf transpose=1 

6.14 ffplay spielt Netzwerkvideo ab und nur die Audiogeschwindigkeit ändert sich

 ./ffplay -window_title „http-Stream“ http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -af atempo=2

6.15 ffplay spielt Netzwerkvideos ab und nur die Videogeschwindigkeit ändert sich

./ffplay -window_title „http-Stream“ http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -vf setpts=PTS/2

6.16 ffplay spielt Online-Videos ab und die Audio- und Videogeschwindigkeit ändert sich gleichzeitig

./ffplay -window_title „http-Stream“ http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -vf setpts=PTS/2 -af atempo=2

Der obige Vorgang wird oft als Videosuche bezeichnet

6.17 ffprobe zeigt die Informationen jedes Streams im JSON-Format an

./ffprobe -print_format json -show_streams ~/Downloads/out.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/lh/Downloads/out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.10.100
  Duration: 00:00:00.12, start: 0.000000, bitrate: 12170 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt470bg/unknown/unknown, progressive), 1080x1080 [SAR 1:1 DAR 1:1], 12110 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.22.100 libx264
    "streams": [
        {
            "index": 0,//多媒体的stream索引;
            "codec_name": "h264",
            "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
            "profile": "High",
            "codec_type": "video",  //多媒体类型,例如视频包,音频包等
            "codec_tag_string": "avc1",
            "codec_tag": "0x31637661",
            "width": 1080,
            "height": 1080,
            "coded_width": 1080,
            "coded_height": 1080,
            "closed_captions": 0,
            "film_grain": 0,
            "has_b_frames": 2,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "1:1",
            "pix_fmt": "yuvj420p",
            "level": 32,
            "color_range": "pc",
            "color_space": "bt470bg",
            "chroma_location": "center",
            "field_order": "progressive",
            "refs": 1,
            "is_avc": "true",
            "nal_length_size": "4",
            "id": "0x1",
            "r_frame_rate": "25/1",
            "avg_frame_rate": "25/1",
            "time_base": "1/12800",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 1536,
            "duration": "0.120000",
            "bit_rate": "12110800",
            "bits_per_raw_sample": "8",
            "nb_frames": "3",
            "extradata_size": 53,
            "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,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0
            },
            "tags": {
                "language": "und",
                "handler_name": "VideoHandler",
                "vendor_id": "[0][0][0][0]",
                "encoder": "Lavc60.22.100 libx264"
            }
        }
    ]
}

6.18 ffprobe zeigt Frame-Informationen im JSON-Format an

./ffprobe -print_format json -show_frames ~/Downloads/out.mp4

 "frames": [
        {
            "media_type": "video",
            "stream_index": 0,
            "key_frame": 1,
            "pts": 0,
            "pts_time": "0.000000",
            "pkt_dts": 0,
            "pkt_dts_time": "0.000000",
            "best_effort_timestamp": 0,
            "best_effort_timestamp_time": "0.000000",
            "pkt_duration": 512,
            "pkt_duration_time": "0.040000",
            "duration": 512,
            "duration_time": "0.040000",
            "pkt_pos": "48",
            "pkt_size": "112313",
            "width": 1080,
            "height": 1080,
            "crop_top": 0,
            "crop_bottom": 0,
            "crop_left": 0,
            "crop_right": 0,
            "pix_fmt": "yuvj420p",
            "sample_aspect_ratio": "1:1",
            "pict_type": "I",
            "coded_picture_number": 0,
            "display_picture_number": 0,
            "interlaced_frame": 0,
            "top_field_first": 0,
            "repeat_pict": 0,
            "color_range": "pc",
            "color_space": "bt470bg",
            "chroma_location": "center",
            "side_data_list": [
                {
                    "side_data_type": "H.26[45] User Data Unregistered SEI message"
                }
            ]
        },
        {
            "media_type": "video",
            "stream_index": 0,
            "key_frame": 0,
            "pts": 512,
            "pts_time": "0.040000",
            "best_effort_timestamp": 512,
            "best_effort_timestamp_time": "0.040000",
            "pkt_duration": 512,
            "pkt_duration_time": "0.040000",
            "duration": 512,
            "duration_time": "0.040000",
            "pkt_pos": "112361",
            "pkt_size": "35468",
            "width": 1080,
            "height": 1080,
            "crop_top": 0,
            "crop_bottom": 0,
            "crop_left": 0,
            "crop_right": 0,
            "pix_fmt": "yuvj420p",
            "sample_aspect_ratio": "1:1",
            "pict_type": "P",
            "coded_picture_number": 1,
            "display_picture_number": 0,
            "interlaced_frame": 0,
            "top_field_first": 0,
            "repeat_pict": 0,
            "color_range": "pc",
            "color_space": "bt470bg",
            "chroma_location": "center"
        },
        {
            "media_type": "video",
            "stream_index": 0,
            "key_frame": 0,
            "pts": 1024,
            "pts_time": "0.080000",
            "best_effort_timestamp": 1024,
            "best_effort_timestamp_time": "0.080000",
            "pkt_duration": 512,
            "pkt_duration_time": "0.040000",
            "duration": 512,
            "duration_time": "0.040000",
            "pkt_pos": "147829",
            "pkt_size": "33881",
            "width": 1080,
            "height": 1080,
            "crop_top": 0,
            "crop_bottom": 0,
            "crop_left": 0,
            "crop_right": 0,
            "pix_fmt": "yuvj420p",
            "sample_aspect_ratio": "1:1",
            "pict_type": "P",
            "coded_picture_number": 2,
            "display_picture_number": 0,
            "interlaced_frame": 0,
            "top_field_first": 0,
            "repeat_pict": 0,
            "color_range": "pc",
            "color_space": "bt470bg",
            "chroma_location": "center"
        }
    ]
}

Acho que você gosta

Origin blog.csdn.net/qq_18757557/article/details/131826726
Recomendado
Clasificación