web-dev-qa-db-ja.com

高画質を維持しながらフレームレートを下げるためにH264ビデオを再サンプリングする

対象のビデオのmplayer出力は次のとおりです。

br@carina:/tmp$ mplayer foo.mov 
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing foo.mov.
libavformat file format detected.
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0, -alang eng
VIDEO:  [H264]  1280x720  24bpp  59.940 fps  2494.2 kbps (304.5 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 15999->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
AO: [Pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1280x720 => 1280x720 Planar YV12

Ffmpeg、mencoder、またはその他のコマンドラインビデオトランスコーダーを使用して、このビデオをimage品質を損なうことなく、より低いフレームレートに再サンプリングします。つまり、各フレームはできるだけ鮮明に保つ必要があります。

試み

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • 目標フレームレート(25fps)は達成されますが、個々のフレームは「ブロック状」です。
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • ビデオは事実上視聴できません。

助けて!

これは十分に単純なユースケースのようです。明らかなことが機能していないことに非常に驚いています。私のアプローチに何か問題がありますか?

34
BrianTheLion

2012年のこの投稿以降、多くの変更が行われました。検索エンジンからこれを見つけた私のような人々のために、この回答を追加しています。私は次の点で幸運でした。

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

すべてのパラメーターの機能について簡単に説明します。

  • -y:確認せずに出力ファイルを上書きします
  • -i source.mp4:入力ファイル名
  • -r 25:出力フレームレート(フレーム/秒)
  • -s 160x90:出力フレームサイズ(ピクセル単位)- ビデオフィルタのスケール を挿入します
  • -c:v libx264:出力ビデオエンコーダー
    • -c:v-codec:vおよび-vcodec
  • -b:v 3Mlibx264エンコーダー に渡されるビデオビットレート(ビット/秒)
  • -strict -2:標準への準拠を管理します。 -2は実験的な機能を許可します-バージョン2015-12-05より古いビルドでネイティブFFmpeg AACオーディオエンコーダを有効にするために必要です。 hereAACはデフォルトのオーディオエンコーダです を参照してください。
  • -movflags faststart:インデックスを出力ファイルの先頭に移動します( mov and mp4 format specific parameter)

詳細については、 公式ドキュメント を参照してください。

92
CodeMed

Andy Tが示したように、ビデオを絶対に再エンコードする必要がありますが、それは品質を目立った方法で低下させる必要があるという意味ではありません。

まず、古いソフトウェアを使用していないことを確認してください。ビデオコーデックは、数週間ごとに大幅な進歩を遂げる動きの速い分野です。 x264は現在、利用可能な最も高度なビデオエンコーダソフトウェアです。おそらくmplayerが使用するものですが、www.x264.nlから最新の実際のリリースを入手できます。

[編集: [〜#〜] hevc [〜#〜] および AV1 は現在利用可能な最も高度な技術です。私が言ったように、これらは動きの速いフィールドです!]

まず、VirtualDubを使用してロスレスビデオタイプに解凍します。これにより、非常に大きなファイルが作成されます。 VirtualDubはフレームレートも下げることができます。 here を参照してください。

次に、これをx264への入力として使用します。 Staxrip のようなヘルパーソフトウェアを使用することをお勧めします(最新の32ビット、チャネルあたり8ビットx264をStaxRip\Applications\x264に置きます。

違いに気付かない可能性のある最小のファイルサイズで絶対的な最高品質が必要な場合は、次のようなコマンドラインを使用してください(x264を使用):

x264 --preset placebo --tune film --crf 22 --level 4.1 --threads 1 --thread-input --sar 12:11 --output "<target>" "<source>"

Staxripには、プリセットをプラセボに切り替え、フィルムソースを調整し(これはもちろんアニメーションではないと仮定して)、スレッド数を1に減らすオプションがあります。

「--crf 22」を21に変更すると、より大きく高品質のビデオに変更できますが、CRF22は、フレームごとに比較した場合でも、違いに気付くのが非常に困難なポイントであることがわかりました。他の設定を変更すると、品質が低下したり、品質が向上したりせずにファイルサイズが増加したりする可能性があります。スレッドの数を増やすと大幅にエンコード速度が向上します(明らかにマルチコアシステムで)が、品質は非常にわずかに低下します(または、この場合、品質ベースでは、ファイルサイズが少し大きくなります(4スレッドで1%未満など)。

ビデオをエンコードする、またはビデオをエンコードする製品を製造するほとんどの企業は、彼らが何をしているのか全くわからず、たとえそれを行ったとしても、これらの設定でエンコードを行うために必要なCPUパワーを持っていません。フレームレートの削減によるファイルサイズの削減では、最も厳しい設定のスマートエンコーダーを使用すると、ファイルサイズが大幅に低下します。

結果のビデオがVirtualDubの出力に可能な限り近いことを確実に確認したい場合、CRF17を使用して誰にも違いを伝えることはできませんが、ファイルはかなり大きくなります。同様に、VirtualDubの出力をZipするだけでもかまいません(それほど悪くはありません!)。

6
Charles Burns

いずれにしても、ビデオをトランスコードする必要があります。トランスコーディングとは、ストリームをデコードし、フレームレートを変更して(単純な場合はフレームをドロップする)、再度エンコードすることを意味します。エンコーディング設定、さらにはコーデックは、ビデオが最初にエンコードされた方法に依存しないため、ニーズに合ったものを使用できます。可能な限り最高の品質が必要な場合は、最初の試みとして高プロファイルでエンコードするだけです。その後、多数のh.264エンコーディングパラメータを使用して、これをさらに微調整してみてください。

0
Andriy Tylychko