🎊

Quick Timer Playerの動画をffmpegで1/15以下まで圧縮

2024/07/07に公開

バージョン情報

  • 手元の作業PC: Apple M1 Pro
  • ffmpeg: 7.0.1
  • ffprobe: 7.0.1

目的

ffmpegでファイルサイズ制限を気にせず、高速かつ明確な圧縮処理を行うこと。
QuickTime Playerの録画ファイルはサイズが大きくなりがちです。video smallerなどのクラウドサービスもありますが、ファイルサイズの制限があったり、圧縮アルゴリズムがブラックボックスです。ffmpegを使用すれば、ファイルサイズを気にせず、高速かつ指定方法で圧縮できます。

圧縮

QuickTime Playerで収録したinput.movを圧縮してoutput.mp4で出力する方法を説明します。

  • オプションの解説
    • -i input.mov: 入力ファイル(今回はinput.mov)を指定します。
    • -c:v libx265: ビデオコーデックにH.265(HEVC)を使用します。H.265は高効率な圧縮を提供します。
    • -c:a aac: オーディオコーデックにAACを使用します。AACは広く互換性のある高品質のオーディオコーデックです。
    • -tag:v hvc1: ビデオストリームのタグを設定し、QuickTime Playerとの互換性を確保します。これにより、QuickTime PlayerがH.265コーデックを正しく認識できます。
ffmpeg -i input.mov -c:v libx265 -tag:v hvc1 -c:a aac output.mp4

ファイルサイズを比較すると、44M (input.mov) から 2.9M (output.mp4) へと圧縮され、約1/15 まで圧縮できました。

ちなみに、よくお世話になっている video smallerで圧縮したものは3.54M (output.mp4)で、約1/12の圧縮でした。
どちらのケースでも1/10以下まで圧縮されていて、非常に有効な圧縮手段です。

圧縮できる理由

今回のケースでは、以下の要因が組み合わさり、ファイルサイズが約1/15に圧縮されました。

1. ビットレートの大幅な削減

  • input.mov: ビットレートが約10.7 Mbps
  • output.mp4: ビットレートが約0.7 Mbps

ビットレートの大幅な削減により、ファイルサイズが大幅に小さくなります。

2. エンコーディングコーデックの違い

  • input.mov: H.264コーデック
  • output.mp4: H.265コーデック(HEVC)

H.265は、H.264に比べて同じ画質で約50%のビットレート削減が可能です。

3. Bフレームの数

  • input.mov: Bフレームが16
  • output.mp4: Bフレームが2

Bフレーム数が減少すると、エンコード効率が上がり、ファイルサイズが減少します。

4. タグの追加

  • input.mov: avc1

    • Advanced Video Coding (H.264) の識別子。これは、ビデオストリームがH.264コーデックを使用してエンコードされていることを示します。
  • output.mp4: hvc1

    • High Efficiency Video Coding (H.265/HEVC) の識別子。これは、ビデオストリームがH.265コーデックを使用してエンコードされていることを示します。

おまけ: ffprobeで各メディアストリームの属性の確認

  • ビットレート
    • フィールド名: bit_rate
    • 例: bit_rate=708614(ビデオストリーム)または bit_rate=715046(フォーマット全体)
  • エンコーディングコーデック
    • codec_nameは略名。codec_long_nameは詳細名
    • フィールド名: codec_name
    • 例: codec_name=hevc
    • フィールド名: codec_long_name
    • 例: codec_long_name=H.265 / HEVC (High Efficiency Video Coding)
  • Bフレームの数
    • フィールド名: has_b_frames
    • 例: has_b_frames=2
  • タグ
    • フィールド名: codec_tag_string
    • 例: codec_tag_string=hvc1
input.movの解析結果
$ ffprobe -v error -show_format -show_streams input.mov

[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_tag_string=avc1
codec_tag=0x31637661
width=3020
height=1630
coded_width=3020
coded_height=1630
closed_captions=0
film_grain=0
has_b_frames=16
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=50
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=center
field_order=progressive
refs=1
is_avc=true
nal_length_size=4
id=0x1
r_frame_rate=60/1
avg_frame_rate=6204000/103549
time_base=1/6000
start_pts=0
start_time=0.000000
duration_ts=206378
duration=34.396333
bit_rate=10675430
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=2068
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=32
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:non_diegetic=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:creation_time=2023-12-30T05:46:56.000000Z
TAG:language=und
TAG:handler_name=Core Media Video
TAG:vendor_id=[0][0][0][0]
TAG:encoder=H.264
[/STREAM]
[FORMAT]
filename=input.mov
nb_streams=1
nb_programs=0
nb_stream_groups=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=34.396333
size=46088228
bit_rate=10719335
probe_score=100
TAG:major_brand=qt  
TAG:minor_version=0
TAG:compatible_brands=qt  
TAG:creation_time=2023-12-30T05:46:56.000000Z
[/FORMAT]
output.mp4の解析結果
$ ffprobe -v error -show_format -show_streams output.mp4

[STREAM]
index=0
codec_name=hevc
codec_long_name=H.265 / HEVC (High Efficiency Video Coding)
profile=Main
codec_type=video
codec_tag_string=hvc1
codec_tag=0x31637668
width=3020
height=1630
coded_width=3024
coded_height=1632
closed_captions=0
film_grain=0
has_b_frames=2
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=153
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=center
field_order=progressive
refs=1
id=0x1
r_frame_rate=60/1
avg_frame_rate=60/1
time_base=1/15360
start_pts=0
start_time=0.000000
duration_ts=528384
duration=34.400000
bit_rate=708614
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=2064
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=2461
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:non_diegetic=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:language=und
TAG:handler_name=Core Media Video
TAG:vendor_id=[0][0][0][0]
TAG:encoder=Lavc61.3.100 libx265
[/STREAM]
[FORMAT]
filename=output.mp4
nb_streams=1
nb_programs=0
nb_stream_groups=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=34.400000
size=3074700
bit_rate=715046
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2mp41
TAG:encoder=Lavf61.1.100
[/FORMAT]

終わりに

QuickTime Playerで録画した動画のファイルサイズをffmpegを使用して効率的に圧縮する方法を紹介しました。H.265コーデックを利用し、ビットレートやBフレームの調整、適切なタグ付けにより、ファイルサイズを大幅に減少させることができました。これにより、高品質を保ちながらストレージスペースの節約が可能です。ぜひ、実際の作業で試してみてください。ffmpegの多機能性を活用すれば、他にもさまざまな動画処理が行えます。

Discussion