web-dev-qa-db-ja.com

TVノイズのシミュレーション

私は少しググったが、答えを見つけることができなかった。画面上のテレビからのビデオとオーディオのノイズをシミュレートするための最初のアプローチは何ですか?つまり、テレビのアンテナを外してもテレビの電源が入っているとき(日本のホラー映画で時々見られるように)。 ffmpegやその他のテクニックを使用できますが、信号の最も単純な形式は何ですか?

24

ffmpegを使用して、ビデオとオーディオのノイズ、アーティファクト、およびエラーを作成します

ノイズ

フィルタの使用

geq (ビデオ「一般方程式」)フィルター( nullsrc を "として空白のキャンバス」)はビデオノイズを生成する可能性があり、 aevalsrc フィルターはホワイトノイズオーディオを生成する可能性があります。

mono noise

ffmpeg -f lavfi -i nullsrc=s=1280x720 -filter_complex \
"geq=random(1)*255:128:128;aevalsrc=-2+random(0)" \
-t 5 output.mkv

これにより、白黒のビデオノイズが発生することに注意してください。

/dev/urandomの使用

geqフィルターを使用することをお勧めしますが、/dev/urandomを使用してビデオおよびオーディオノイズを生成することもできます(Windowsユーザーは上記のようにgeqフィルターを使用する必要があります)。これは小さなスクリーンショットですが、もちろんビデオは静止画像ではありません。

colored noise

ffmpeg -f rawvideo -video_size 1280x720 -pixel_format yuv420p -framerate 25 \
-i /dev/urandom -ar 48000 -ac 2 -f s16le -i /dev/urandom -codec:a copy \
-t 5 output.mkv

これにより、カラービデオノイズが発生します。白黒だけが必要な場合は、 hue フィルターを追加できます。

mono noise

ffmpeg -f rawvideo -video_size 1280x720 -pixel_format yuv420p -framerate 25 \
-i /dev/urandom -ar 48000 -ac 2 -f s16le -i /dev/urandom -codec:a copy \
-t 5 -vf hue=s=0 output.mkv

既存のビデオにランダムな視覚的ノイズとエラーを追加する

noiseビットストリームフィルター の使用:

original imageenter image description here元のバージョンと変更されたバージョン。

ffmpeg -i input.mp4 -codec:v huffyuv -bsf:v noise -codec:a copy noise.mkv

ドキュメント によると:

ビットストリームフィルターは、エンコードされたストリームデータを操作し、デコードを実行せずにビットストリームレベルの変更を実行します。

このビットストリームフィルターは、ノイズの量を増減する値を受け入れることができます。逆数であるため、数値が大きいほどノイズが少なくなり、1が最小の数値であるため、ノイズが最大になります。何が最適かを確認するには、実験する必要があります。

この最初の例 ストリームはオーディオをコピー し、ビデオのみをグリッチしましたが、ストリーム指定子を削除することで、オーディオとビデオの両方にフィルターを適用できます。

ffmpeg -i input.mp4 -codec:v huffyuv -c:a pcm_s16le -bsf noise=1000000 noise.mkv

または、ビデオとオーディオに別々の値を指定します。

ffmpeg -i input.mp4 -codec:v huffyuv -c:a pcm_s16le -bsf:v noise=1000000 -bsf:a noise=100 noise.mkv

これは、ビデオの場合はrawvideoまたはhuffyuv、オーディオの場合はpcm_s16leでうまく機能するようですが、実験することをお勧めします。さまざまなエンコーダーがノイズの破損にどのように反応するかを示すビデオについては、 ロスレスvs破損notes )を参照してください。

出力noise.mkvが破損していますが、プレーヤーで機能するように再エンコードできます。

ffmpeg -i noise.mkv -codec:v libx264 -pix_fmt yuv420p output.mkv

エンコードの詳細については、FFmpeg Wikiの H.264 および [〜#〜] aac [〜#〜] エンコードガイドを参照してください。情報。

マクロブロック効果

これを行うにはいくつかの方法がありますが、この例ではノイズビットストリームフィルターが使用されます。 TSでMPEG-2ビデオに出力します。これは、目的の効果の影響を受けやすくなるためです。

ffmpeg -i input.mp4 -bsf:v noise -c:v mpeg2video -q:v 2 -c:a copy macroblock.ts

より「エンコードされた」外観が必要な場合は、-q:vの値を〜20に増やします。さらにノイズが必要な場合は、上記のセクションに示すようにノイズ値を追加します。

出力macroblock.tsが破損していますが、プレーヤーで機能するように再エンコードできます。

ffmpeg -i macroblock.ts -codec:v libx264 -pix_fmt yuv420p output.mp4

ノイズビットストリームフィルターの詳細については、上記のセクションを参照してください。

結果は異なる場合があるため、探しているものが得られない場合があります。以下の16進エディターの方法を参照してください。

16進エディタの使用

もう1つの方法は、16進エディターを使用することです。これは、より簡単で、より制御可能で、より一貫性があることがわかります。見る:


ピクセルフォーマットの強制

Ffmpegに嘘をついて、色空間とクロマサブサンプリングが実際には奇妙なエラーのような効果をもたらしているのとは異なると思わせることができます。

original imageenter image description here元のバージョンと変更されたバージョン。

  1. 入力を調べます。

    ffmpeg -i original.mp4
    

    フレームレートとビデオフレームサイズに注意してください。

  2. ffmpeg -pix_fmtsを参照し、yuv420p16leなどの使用可能な形式の1つを選択します。

  3. Rawvideoを作成し、それを別のffmpegインスタンスにパイプします。

    ffmpeg -loglevel error -i original.mp4 -f rawvideo - | ffmpeg -y -f rawvideo -framerate 25 -video_size 1280x720 -pixel_format yuv420p16le -i - -pix_fmt yuv420p video.mp4
    

    -framerate-video_sizeの値は、手順1のコンソール出力に表示された元の入力ファイル情報からコピーされました。もちろん、これらを操作してさまざまな効果を得ることができます。

  4. 必要に応じてマルチプレクサオーディオ

    ffmpeg -i video.mp4 -i original.mp4 -map 0 -map 1:a -c copy output.mp4
    
60
llogan

はい、ffmpegを使用できます:

ffmpeg -s 640x480 -t 8 \
-f rawvideo -pix_fmt gray16be -i /dev/urandom \
-f s32le -i /dev/urandom \
output.mp4
0
ncomputers

比較のために、疑似乱数を生成する3つの異なる方法をテストしました。ご覧のとおり、速度は大きく異なります。悪い幅が大きい場合は、最初の解決策をお勧めします。ここでソースを見つけることができます: https://github.com/Zibri/Rand

ちなみに、ソースをさらに最適化して、さらに高速にすることができます。

$ ./Rand|pv -S -s 2G >/dev/null
2,00GiB 0:00:01 [1,58GiB/s] [========================================================================>] 100%            

$ cat /dev/urandom|pv -S -s 2G >/dev/null
2,00GiB 0:00:11 [ 178MiB/s] [========================================================================>] 100%            

$ dd if=/dev/zero bs=1k count=2M 2>/dev/null | openssl enc -rc4-40 -pass pass:weak |pv -S -s 2G >/dev/null
2,00GiB 0:00:04 [ 413MiB/s] [========================================================================>] 100%            
0
Zibri