オーディオとビデオの開発 - ffmpeg 入門 - シリーズ 1

目次

1. はじめに

FFmpeg フレームワークの基本構成には次のものが含まれます。

2. FFmpeg フレームワークはオーディオとビデオのプロセスを整理します編集

基本コンセプト:

3. ffmpeg、ffplay、ffprobe の違い

     4.1 ffmpeg はトランスコーディング用のアプリケーションです 

4.2 fffplayはプレイするためのアプリケーションです 

     4.3 ffprobe はファイル形式を表示するためのアプリケーションです

     4.4 ffmpeg はトランスコーディング用のアプリケーションです 

  5. 一般的なファイル形式とエンコーディング

  5.1 一般的なビデオ形式とファイル形式

5.2 一般的なコード化オーディオのトランスコーディング形式

6 番目に、ffmepg スクリプトをコンパイルします。

6.1 ffmpeg コアツール

6.2 ビデオの変換

 6.3 変形クロップ

 6.3 ビデオのミュート

6.4 ビデオに透かしを追加する

 6.5 ビデオ速度の変更

6.6 ビデオにモザイクを追加する

6.7 ビデオのスクリーンショット

 6.8 画像に透かしを追加する

 6.9 画像合成ビデオ


  • 1. はじめに

 , FFmpeg 公式サイトアドレス  をダウンロード
FFmpegの正式名称はFast Forward Moving Picture Experts Group(mpeg:Moving Picture Experts Group)で、2000年に誕生した無料のオープンソースのオーディオおよびビデオコーデックツールおよび開発キットです。強力で多用途なため、ビデオ サイトや商用ソフトウェア (Youtube や iTunes など) で頻繁に使用されています。
FFmpeg 自体は、多くのコンポーネントとライブラリ ファイルを含む巨大なプロジェクトです。最も一般的に使用されるのはそのコマンド ライン ツールです。FFmpeg は、オーディオおよびビデオ コーデック ツールであるだけでなく、コーデックとしてのオーディオおよびビデオ コーデック開発キットのセットでもあります。開発キットは、開発者にオーディオおよびビデオ処理のための豊富な通話インターフェイスを提供しますFFmpeg は、複数のオーディオおよびビデオのエンコード、複数プロトコルのストリーミング メディア、複数のカラー フォーマット変換、複数のサンプリング レート変換、複数のコード レート変換などを含む、さまざまなメディア フォーマットのカプセル化とカプセル化解除を提供します。FFmpeg フレームワークは、複数のさまざまなプラグインを提供します。パッケージ化およびカプセル化解除用のプラグイン、エンコードおよびデコード用のプラグインなどを含むモジュール内。

FFmpeg は、非常に包括的な画像処理スイートです。

  1. FFmpeg フレームワークの基本構成には次のものが含まれます。

    各関数ライブラリの役割 

    libavcodec: コーデック ライブラリ。MPEG4、AAC、MJPEG、その他の組み込みメディア コーデック形式などをサポート * サードパーティ コーデックのサポート: H.264 (AVC) エンコード、x264 エンコーダを使用する必要がある; H.265 (HEVC) エンコード、x265 を使用する必要があるMP3 (mp3lame) エンコードの場合は、libmp3lame エンコーダを使用する必要があります。独自のエンコード形式、またはハードウェアのエンコードとデコードを追加したい場合は、対応するエンコードおよびデコード モジュールを AVCodec に追加する必要があります。

    libavformat: オーディオおよびビデオのコンテナ形式とサポートされるプロトコルのカプセル化と分析。ファイルカプセル化形式:MP4、FLV、KV、TSなど ※ネットワークプロトコルカプセル化形式:RTMP、RTSP、MMS、HLSなど

    libavutil: いくつかのパブリック関数とツール ライブラリを提供します。

    libavfilter: ビデオ透かし、オーディオ音声変更などのオーディオおよびビデオ フィルター ライブラリ。

    libavdevice: カメラ データの読み取りや画面記録など、多くのデバイス データの入出力をサポートします。

    libswresample、libavresample: オーディオ リサンプリング ツール ライブラリを提供します。

    libswscale: 画像の YUV 変換など、ビデオ画像の色変換、スケーリング、ピクセル形式変換を提供します。

    libpostproc: マルチメディア ポスト プロセッサ。

  2. 2.  FFmpeg フレームワークによるオーディオとビデオの結合プロセス

    基本コンセプト:

    コンテナ(Container) コンテナとは、flv、mkvなどのファイル形式のことです。以下の 5 つのストリームとファイルヘッダー情報が含まれます。

    ストリーム(Stream)とは、映像データ情報の伝送方式で、音声、映像、字幕、添付ファイル、データの5種類のストリームがあります。

    Frame (フレーム) Frame は静止画を表し、I フレーム、P フレーム、B フレームに分かれます。

    コーデック(Codec)とは、動画を圧縮または解凍するためのもので、 CODEC =Code(エンコード)+DECode(デコード)

    多重化/逆多重化 (mux/demux) 特定のコンテナのルールに従って異なるストリームをコンテナに入れるこの動作は、多重化 (mux) と呼ばれます。 特定のコンテナからの異なるストリームを解析する、この動作は逆多重化 (demux) と呼ばれます。FFmpeg がサポートしているかどうかに関係ありません。特定のメディア パッケージ化形式は、コンパイル中にこの形式のパッケージ化ライブラリが含まれるかどうかによって異なります。実際のニーズに応じて、メディア パッケージング形式を拡張して、独自にカスタマイズしたパッケージング形式を追加できます。つまり、AVFormat に独自のパッケージング処理モジュールを追加します。

  3. 3. ffmpeg、ffplay、ffprobe の違い

     4.1 ffmpeg はトランスコーディング用のアプリケーションです 
     4.2 fffplayはプレイするためのアプリケーションです 
     4.3 ffprobe はファイル形式を表示するためのアプリケーションです

  5. 一般的なファイル形式とエンコーディング

  5.1 一般的なビデオ形式とファイル形式

5.2 一般的なエンコードされたオーディオのトランスコーディング形式

  • MP4 パッケージ: H264 ビデオ エンコーディング + AAC オーディオ エンコーディング (比較的成熟した)

  • WebM パッケージ: VP8 ビデオ エンコーディング + Vorbis オーディオ エンコーディング (Google ソリューション)

  • OGG パッケージ: Theora ビデオ エンコーディング + Vorbis オーディオ エンコーディング (オープン ソース)

6 番目に、ffmepg スクリプトをコンパイルします。

#!/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

 

./buildsh.sh を実行します

コンパイルが成功した後の製品

6.1 ffmpeg コアツール

ffmpeg は次の 3 つのツールを提供します

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

ビデオ情報を取得する

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

このセクションの情報は、ファイルの

メタデータ情報:

Major_brand フィールドは、ファイルのカプセル化形式が mp42 (MP4 形式の準標準)、ファイル作成時刻が 2023-07-21T03:32:06.000000Z、ビデオの長さが 00:00:07.86 (71 秒 86) であることを示します。 )、再生を開始します。時間は 0.000300ms から、ファイルのビットレートは 1457 kb/s です。

最初のビデオ情報:

この部分の情報を紹介する前に、いくつかの技術用語、つまりタイムベースの定義を理解しておく必要があります。

tbr はフレーム レートを示し、このパラメータはベンチマークとなる傾向があります。多くの場合、tbr は fps と同じです。tbn は
ビデオ ストリームのタイムベース (タイムベース) を示します。たとえば、ts ストリームのタイムベースは 90000、 flv 形式のビデオ ストリームは 1000 
tbc で、ビデオ ストリームのコーデック タイムベースを示します。264 コード ストリームの場合、パラメータは sps を解析することによって間接的に取得されます (フレーム レートは sps を通じて取得されます)。情報のこの部分は、ファイルの最初のストリームであることを示します
。ビデオストリーム、エンコード方式は H264 形式、カプセル化形式は AVC1、フレームのデータ形式は yuv420p、解像度は 480x640、ビットレートは 1450 kb/s

6.2 ビデオの変換

mp4形式のビデオをflv形式に変換します

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

具体的な変換プロセスは次のとおりです。

 6.3 変形クロップ

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

test.mp4の3秒目から6秒目までをカットします。以下がカット手順です。

 6.3 ビデオのミュート

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

説明: このコマンドの機能は、指定された時間に従って 210710171112971120.mp4 ビデオをミュートし、新しい Output.mp4 ビデオを生成することです。volume=enable='between(t,5,10)':volume=0 5 秒目から 10 秒目までミュートします。このコマンドは複数、つまり複数のミュートをカンマで区切って書き込むことができます。

6.4 ビデオに透かしを追加する

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -vf "movie=/Users/lh/Downloads/shuiyin.jpeg,colorchannelmixer=aa=0.4,scale=300:300 [ウォーターマーク]; [in][ウォーターマーク] オーバーレイ" /Users/lh/Downloads/output.mp4

例証します:

このコマンドの機能は、指定されたコマンドに従って input.mp4 ビデオに透かしを入れ、新しい Output.mp4 ビデオを生成することです。

movie=input.png 透かし画像、

colorchannelmixer=aa=0.4 ウォーターマークの透明度 (透明度を変更する必要がない場合は、この段落を削除してください)

scale=300:300 ウォーターマークのサイズ (元のウォーターマーク サイズを使用する場合は、このセクションを削除します)

overlay ウォーターマークの位置。デフォルトは左上隅です。

        overlay=Ww 右上隅

        overlay=0:Hh 左下隅

        overlay=Ww:Hh 右下隅

ps:ウォーターマークを端に表示する必要がない場合は、WとHの値を少し変更するだけです
 

動画にウォーターマークを追加する方法

 左下隅に配置したい場合

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -vf "movie=/Users/lh/Downloads/shuiyin.jpeg,colorchannelmixer=aa=0.4,scale=300:300 [ウォーターマーク]; [in][ウォーターマーク] overlay=Ww:Hh" /Users/lh/Downloads/output.mp4

下のエフェクト画像

 6.5 ビデオ速度の変更

./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

例証します:

このコマンドの機能は、210710171112971120.mp4 ビデオを指定された速度で変換して、新しい output.mp4 ビデオを生成することです。setpts=0.5*PTS ビデオ アクセラレーション (デフォルトは 1 ですが、現在は 0.5 です。2 倍速くなります)

atempo=2.0 オーディオアクセラレーション (デフォルトは 1 ですが、現在は 0.5 です。2 倍の速度になります)

ps: ビデオ アクセラレーションとオーディオ アクセラレーション、倍速は一貫している必要があります。そうしないと、サウンドとビデオが同期しなくなります。

実際には、動画の早送りの 2 倍の速度で動画を再生することに相当し、たとえば、一部の動画サイトでは、1.2 倍、1.5 倍、2 倍で動画が再生されているのをよく見かけます。

6.6 ビデオにモザイクを追加する

ビデオや写真にモザイクを追加する必要がある場合は、 boxblur フィルターを使用できます。このフィルターは、指定した領域をぼかし効果に変換し、モザイク効果を実現します。簡単な例を次に示します。

./ffmpeg -i /Users/lh/Downloads/210710171112971120.mp4 -filter_complex "[0:v]boxblur=10[blur];[blur]crop=200:200:300:300,boxblur=10[トリミング]; [0:v][トリミング]オーバーレイ=300:300" /Users/lh/Downloads/output.mp4 

説明する

このうち -i 210710171112971120.mp4 は入力ファイルを指定することを意味します。[0:v]boxblur=10[blur] はビデオ画像をぼかすことを意味し、ぼかし半径は 10 ピクセルで、中間変数ぼかしとして保存されます。[blur]crop=200:200:300:300,boxblur=10[cropped] は、ぼやけたビデオ画面をトリミングし、開始座標が (300, 300) の左上隅と幅の領域のみを保持することを意味します。そして、再度ファジー処理を実行し、トリミングされた中間変数として保存します。最後に、オーバーレイ フィルターを使用して、元のビデオとトリミングされたモザイク画像を重ね合わせ、新しいビデオ ファイル Output.mp4 を生成します。

モザイクのサイズ、位置、形状、その他のプロパティを調整する必要がある場合は、設定用のさまざまなパラメーターを追加できます。

ビデオ内の透かしやモザイクをソフトウェア ツールで削除できない場合は、FFmpeg または同様のツールを使用してビデオに他のレイヤーを追加して、これらの領域をカバーしてみてください。

以下はコーディング効果です
 

6.7 ビデオのスクリーンショット

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

例証します:

-f mjpeg は、フォーマットされた形式が mjpeg であることを指定します。

-ss 30 30秒目からインターセプトを開始します

-t 1 フレームをキャプチャします

効果は以下の通りです

 6.8 画像に透かしを追加する

./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 /出力.jpg

例証します:

ここで W 、 および は H ビデオ画像の幅と高さを表し、w および は h 透かし画像の幅と高さをそれぞれ表します。alpha=0.5 ウォーターマークの透明度を 0.5 に設定することを示します。

効果は以下の通りです 

 6.9 画像合成ビデオ

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

/Users/lh/Downloads/imgs/ ディレクトリにある 6 枚の写真を 1 つのビデオに結合します

 出力結果:

6.10 ビデオに字幕を追加する

まずは字幕ファイルを作成します

猫の冬.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/ダウンロード/出力.mp4 

効果は以下の通りです

6.11 オンラインビデオを再生し、ウィンドウタイトルを http ストリームに設定する

./ffplay -window_title "http ストリーム" http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4

効果は以下の通りです

6.12 ffplay はネットワーク ビデオを再生し、デコーダを強制します

./ffplay -vcodec h264 -window_title "http ストリーム" http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4

デコーダを強制的に h264 にする

効果は以下の通りです

6.13 ffplay はネットワークビデオを再生し、ビデオを回転します 

./ffplay -window_title "http ストリーム" http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -vf transpose=1 

6.14 ffplay はネットワーク ビデオを再生しますが、音声の速度のみが変わります

 ./ffplay -window_title "http ストリーム" http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -afatempo=2

6.15 ffplay はネットワークビデオを再生しますが、ビデオ速度のみが変化します

./ffplay -window_title "http ストリーム" http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -vf setpts=PTS/2

6.16 ffplay がオンラインビデオを再生すると、オーディオとビデオの速度が同時に変化します

./ffplay -window_title "http ストリーム" http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4 -vf setpts=PTS/2 -afatempo=2

上記の操作は、よくビデオのシークと呼ばれるものです。

6.17 ffprobeは各ストリームの情報をjson形式で表示します

./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はフレーム情報をjson形式で表示します

./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"
        }
    ]
}

おすすめ

転載: blog.csdn.net/qq_18757557/article/details/131826726