38

対象のビデオの 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、またはその他のコマンドライン ビデオ トランスコーダを使用して、画質を落とさずにこのビデオをより低いフレームレートに再サンプリングしたいと考えています。つまり、各フレームはできるだけ鮮明なままにする必要があります。

試み

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • 目標のフレーム レート (25 fps) は達成されていますが、個々のフレームが「ブロック状」になっています。
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • ビデオは実質的に見ることができません。

ヘルプ!

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

4

3 に答える 3

106

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:vandの略です-vcodec
  • -b:v 3M: libx264 エンコーダー に渡されるビデオ ビットレート (bit/s)
  • -strict -2 : 標準への準拠を管理します。-2実験的な機能を許可します - バージョン 2015-12-05 より古いビルドでネイティブ FFmpeg AAC オーディオ エンコーダーを有効にする必要があります。こちらを参照してください。AACがデフォルトのオーディオ エンコーダーになりました。
  • -movflags faststart: インデックスを出力ファイルの先頭に移動します ( mov および mp4 形式固有のパラメーター)

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

于 2015-01-21T17:54:42.783 に答える
6

Andy T が指摘したように、動画は絶対に再エンコードする必要がありますが、それは品質を著しく低下させる必要があるという意味ではありません。

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

[編集: HEVCAV1は現在、利用可能な最も高度なテクノロジです。私が言ったように、これらは動きの速いフィールドです!]

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

次に、これを 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 は、フレームごとに比較しても、違いに気付くのが非常に難しいポイントであることがわかりました。他の設定を変更すると、おそらく品質が低下するか、品質が向上することなくファイルサイズが増加します. スレッドの数を増やすと、エンコード速度が大幅に向上しますが (マルチコア システムでは明らかに)、品質がわずかに低下します (または、この場合、品質ベースの CRF を使用しているため、ファイル サイズが少し増加します。 4 スレッドの場合は 1% 未満)。

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

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

于 2012-06-12T22:25:26.960 に答える
0

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

于 2012-06-12T22:05:20.303 に答える