ffmpeg でスクリーンキャストをいくつか作成しました。使用している PC は高性能なハードウェア (Intel Core i7-4930K 6 コア 3.40GHz 12MB キャッシュ、32 GB RAM) を備えていますが、残念ながら Windows 7 で実行されています。スクリーンキャストを Linux で実行したいので、VMware に Kubuntu をインストールしました。VM に 4 つの CPU コアと 4 GB RAM を割り当てました。
次のコマンドでスクリーンキャストを録画します。
ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec mp3 -vcodec libx264 -preset ultrafast -crf 0 -threads 0 output.mp4
しかし、ビデオはオーディオよりはるかに速く再生されます。数分後、オーディオ (マイクで録音) はビデオより数秒遅れます。Windows ホストでオーディオを audacity と並行して録音してみましたが、audacity からのオーディオと VM で ffmpeg によってキャプチャされたオーディオは同期しているようです。ビデオが速すぎるだけです。
その理由は何でしょうか? VMware に関係しているのでしょうか? 調整できる設定はありますか? 同期に使用できる ffmpeg オプションはありますか? たとえば、オーディオとビデオが同期していない場合に ffmpeg にフレームをドロップまたは複製するように強制できれば、私にとってはまったく問題ありませんが、ffmpeg の -vsync オプションのマニュアルを理解する限り、これはすでにデフォルトになっています。
私はffmpegを自分でコンパイルしました。Ubuntu コンパイルガイドそして、ffmpegを使うというアイデアはここ。
編集: 要求どおりの ffmpeg 出力:
$ /home/yankee/bin/ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec mp3 -vcodec libx264 -preset ultrafast -crf 0 -threads 0 05-visitor.mp4
ffmpeg version 2.1.git Copyright (c) 2000-2014 the FFmpeg developers
built on Feb 24 2014 08:38:08 with gcc 4.8 (Ubuntu/Linaro 4.8.1-10ubuntu9)
configuration: --prefix=/home/yankee/ffmpeg_build --extra-cflags=-I/home/yankee/ffmpeg_build/include --extra-ldflags=-L/home/yankee/ffmpeg_build/lib --bindir=/home/yankee/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab
libavutil 52. 65.100 / 52. 65.100
libavcodec 55. 52.102 / 55. 52.102
libavformat 55. 33.100 / 55. 33.100
libavdevice 55. 10.100 / 55. 10.100
libavfilter 4. 1.103 / 4. 1.103
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, alsa, from 'pulse':
Duration: N/A, start: 1394106509.365291, bitrate: 768 kb/s
Stream #0:0: Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
[x11grab @ 0x2551e40] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 1920 height: 1080
[x11grab @ 0x2551e40] shared memory extension found
Input #1, x11grab, from ':0.0':
Duration: N/A, start: 1394106509.415547, bitrate: 1990656 kb/s
Stream #1:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1920x1080, 1990656 kb/s, 30 tbr, 1000k tbn, 30 tbc
No pixel format specified, yuv444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x256db60] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x256db60] profile High 4:4:4 Predictive, level 4.0, 4:4:4 8-bit
[libx264 @ 0x256db60] 64 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to '05-visitor.mp4':
Metadata:
encoder : Lavf55.33.100
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv444p, 1920x1080, q=-1--1, 15360 tbn, 30 tbc
Stream #0:1: Audio: mp3 (libmp3lame) (i[0][0][0] / 0x0069), 48000 Hz, mono, s16p
Stream mapping:
Stream #1:0 -> #0:0 (rawvideo -> libx264)
Stream #0:0 -> #0:1 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
frame=19011 fps= 30 q=-1.0 Lsize= 186418kB time=00:10:34.84 bitrate=2405.5kbits/s
video:180861kB audio:4960kB subtitle:0 data:0 global headers:0kB muxing overhead 0.321432%
[libx264 @ 0x256db60] frame I:77 Avg QP: 0.00 size:451985
[libx264 @ 0x256db60] frame P:18934 Avg QP: 0.00 size: 7943
[libx264 @ 0x256db60] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0x256db60] mb P I16..4: 59.7% 0.0% 0.0% P16..4: 0.0% 0.0% 0.0% 0.0% 0.0% skip:40.3%
[libx264 @ 0x256db60] coded y,u,v intra: 0.2% 0.2% 0.2% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x256db60] i16 v,h,dc,p: 100% 0% 0% 0%
[libx264 @ 0x256db60] kb/s:2338.03
もう少しいろいろ試してみたところ、出力ファイルがすでに存在する場合、ffmpeg はファイルを上書きするかどうかを尋ねてくることに気付きました。この場合、オーディオ ストリームには、ファイルの上書きの質問がある間に私が言ったことがすでに含まれています。ただし、ファイルの上書きを確認するまでビデオは開始されず、そのためオーディオは当然ビデオよりかなり遅れます。しかし、これは簡単に対処できます。既存のファイルを上書きしないようにするだけです。
ビデオがロスレス形式であり、Adobe Premiere で編集できる限り (mkv はサポートされていません)、最終的な形式は特に気にしません。
編集2: 問題に少し近づきました。結果のビデオ ストリームを非常に詳しく見ると、いくつかのフレームが欠落していることが時々わかります。この瞬間にウィンドウを開いたため、ビデオ圧縮で CPU の消費量が増えた (多くのピクセルが変更されたため) などが原因である可能性があります。このような瞬間に処理を高速化するために、ffmpeg に割り当てることができるバッファーがあるでしょうか。結局のところ、私のマシンには 32 GB の RAM があり、何かに使用できるはずです... または、使用できるロスレス コーデックが他にありますか...? 次回は、ffmpeg の CPU 優先度を高く設定してみます。
答え1
これは 2019 年に私の場合はうまくいきました。さまざまなエンコーダーを試してみましたが、native
ffmpeg に対応していないエンコーダーを使用すると、オーディオとビデオが同期しなくなります。具体的には、ビデオが遅れます。mpeg4
およびaac
ですnative
。
ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec aac -vcodec mpeg4 -preset medium -qscale:v 5 rec.mkv
答え2
"[swscaler @ 0xa314080] 警告: データが整列されていません。これにより速度低下が発生する可能性があります" というメッセージが表示され、これが問題のようです。ただし、まだ解決策は見つかっていません。