目次
FFmpeg フレームワークの基本構成には次のものが含まれます。
2. FFmpeg フレームワークはオーディオとビデオのプロセスを整理します編集
4.1 ffmpeg はトランスコーディング用のアプリケーションです
4.2 fffplayはプレイするためのアプリケーションです
4.3 ffprobe はファイル形式を表示するためのアプリケーションです
4.4 ffmpeg はトランスコーディング用のアプリケーションです
5.2 一般的なコード化オーディオのトランスコーディング形式
-
1. はじめに
, FFmpeg 公式サイトアドレス をダウンロード
FFmpegの正式名称はFast Forward Moving Picture Experts Group(mpeg:Moving Picture Experts Group)で、2000年に誕生した無料のオープンソースのオーディオおよびビデオコーデックツールおよび開発キットです。強力で多用途なため、ビデオ サイトや商用ソフトウェア (Youtube や iTunes など) で頻繁に使用されています。
FFmpeg 自体は、多くのコンポーネントとライブラリ ファイルを含む巨大なプロジェクトです。最も一般的に使用されるのはそのコマンド ライン ツールです。FFmpeg は、オーディオおよびビデオ コーデック ツールであるだけでなく、コーデックとしてのオーディオおよびビデオ コーデック開発キットのセットでもあります。開発キットは、開発者にオーディオおよびビデオ処理のための豊富な通話インターフェイスを提供します。FFmpeg は、複数のオーディオおよびビデオのエンコード、複数プロトコルのストリーミング メディア、複数のカラー フォーマット変換、複数のサンプリング レート変換、複数のコード レート変換などを含む、さまざまなメディア フォーマットのカプセル化とカプセル化解除を提供します。FFmpeg フレームワークは、複数のさまざまなプラグインを提供します。パッケージ化およびカプセル化解除用のプラグイン、エンコードおよびデコード用のプラグインなどを含むモジュール内。
FFmpeg は、非常に包括的な画像処理スイートです。
-
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. FFmpeg フレームワークによるオーディオとビデオの結合プロセス
基本コンセプト:
コンテナ(Container) コンテナとは、flv、mkvなどのファイル形式のことです。以下の 5 つのストリームとファイルヘッダー情報が含まれます。
ストリーム(Stream)とは、映像データ情報の伝送方式で、音声、映像、字幕、添付ファイル、データの5種類のストリームがあります。
Frame (フレーム) Frame は静止画を表し、I フレーム、P フレーム、B フレームに分かれます。
コーデック(Codec)とは、動画を圧縮または解凍するためのもので、 CODEC =Code(エンコード)+DECode(デコード)
多重化/逆多重化 (mux/demux) 特定のコンテナのルールに従って異なるストリームをコンテナに入れるこの動作は、多重化 (mux) と呼ばれます。 特定のコンテナからの異なるストリームを解析する、この動作は逆多重化 (demux) と呼ばれます。FFmpeg がサポートしているかどうかに関係ありません。特定のメディア パッケージ化形式は、コンパイル中にこの形式のパッケージ化ライブラリが含まれるかどうかによって異なります。実際のニーズに応じて、メディア パッケージング形式を拡張して、独自にカスタマイズしたパッケージング形式を追加できます。つまり、AVFormat に独自のパッケージング処理モジュールを追加します。
-
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"
}
]
}