18

Windows 7 @ 720p を使用して、blackmagic デッキリンク キャプチャ カードからオーディオとビデオをキャプチャしようとしていますが、ffmpeg コマンド ライン設定を正しく取得できないようです。

ffmpeg -list_devices true -f dshow -i ダミー

[dshow @ 02457a60] DirectShow video devices
[dshow @ 02457a60]  "Blackmagic WDM Capture"
[dshow @ 02457a60]  "Decklink Video Capture"
[dshow @ 02457a60] DirectShow audio devices
[dshow @ 02457a60]  "Decklink Audio Capture"

ffmpeg -list_options true -f dshow -i video="Decklink ビデオ キャプチャ"

[dshow @ 03c2ea20] DirectShow video device options
[dshow @ 03c2ea20]  Pin "Capture"
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=720x486 fps=29.97 max s=720x486 fps=29.97
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=720x486 fps=23.976 max s=720x486 fps=23.976
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=720x576 fps=25 max s=720x576 fps=25
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=720x486 fps=59.9402 max s=720x486 fps=59.9402
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=720x576 fps=50 max s=720x576 fps=50
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1920x1080 fps=23.976 max s=1920x1080 fps=23.976
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1920x1080 fps=24 max s=1920x1080 fps=24
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1920x1080 fps=25 max s=1920x1080 fps=25
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1920x1080 fps=29.97 max s=1920x1080 fps=29.97
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1920x1080 fps=30 max s=1920x1080 fps=30
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1280x720 fps=50 max s=1280x720fps=50
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1280x720 fps=59.9402 max s=1280x720 fps=59.9402
[dshow @ 03c2ea20]   pixel_format=uyvy422  min s=1280x720 fps=60.0002 max s=1280x720 fps=60.0002

ffmpeg -list_options true -f dshow -i audio="Decklink オーディオ キャプチャ"

[dshow @ 047fea20] DirectShow audio device options
[dshow @ 047fea20]  Pin "Capture"
[dshow @ 047fea20]   min ch=1 bits=16 rate= 48000 max ch=1 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=2 bits=16 rate= 48000 max ch=2 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=4 bits=16 rate= 48000 max ch=4 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=6 bits=16 rate= 48000 max ch=6 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=8 bits=16 rate= 48000 max ch=8 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=10 bits=16 rate= 48000 max ch=10 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=12 bits=16 rate= 48000 max ch=12 bits=16 rate= 48000
[dshow @ 047fea20]   min ch=16 bits=16 rate= 48000 max ch=16 bits=16 rate= 48000

これは、decklink カードの hdmi ポートに接続された、現在のビデオ/オーディオ ソースのストリーム情報です。

Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422(tv), 1280x720, 59.94 tbr, 10000k tbn, 59.94 tbc
Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s

最終的には、このビデオを画面に表示する必要があります。また、プレビューの再生を続けながら、同時に録画を開始および停止できます。

私のアイデアは、ffmpeg を使用してビデオとオーディオ信号をキャプチャし、これをネットワーク ストリーム (例: 127.0.0.1:6666) に送信することでした。次に、VLC プレーヤーを使用してストリーム (プレビュー) を表示します。そして最終的に別のffmpegを開始および/または停止して、同じストリームをディスクに保存します。

私の考えではこれはうまくいきますが、私はオーディオ/ビデオの専門家ではないので、経験のある人が助けてくれれば幸いです.

アップデート:

次のコマンドを使用して、ffplay を使用してビデオを表示できました。

ffplay -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2

次のステップはそれをストリーミングして、VLC でストリーム (プレビュー) を表示できるようにすることです。

このコマンドを使用しようとしました:

ffmpeg -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2 -f mpegts rtp://127.0.0.1:6666?pkt_size=188?buffer_size=65535

これはエラーを発生させないので、うまくいくようです。しかし、VLC でストリームを開こうとすると、次のエラーが発生します。

SDPが必要:RTPストリームを受信するには、SDP形式での記述が必要です。rtp:// URI は動的 RTP ペイロード形式 (65) では機能しないことに注意してください。

少し読んだ後、私は rtp:// ではなく udp:// にストリーミングするべきだと思われます

コマンドは次のようになりました:

ffmpeg -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2 -f mpegts udp://127.0.0.1:6666?pkt_size=188?buffer_size=65535

今VLCで開こうとすると、エラーも警告も表示されませんが、ビデオも表示されません。

もう少し読む時間です。

4

1 に答える 1

33

最後にそれが機能しました。私のセットアップでは、これがすべて単一のマシンで実行されています。

ビデオを取得してUDP経由で提供するには、次のコマンドを使用します。

ffmpeg -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -r 30 -threads 4 -vcodec libx264 -crf 0 -preset ultrafast -f mpegts "udp://239.255.12.42:6666"
  • -f dshow直接表示を使用する必要があることをffmpegに伝えます。
  • -video_size 1280x720ソースのサイズを設定します。私は 720p60 のソースを使用しているので、これです。
  • 702000kこれがないとリアルタイム バッファが数秒でいっぱいになってしまうので、これは非常に重要です。
  • -framerate 60ソースが60fpsを使用していることをffmpegに伝えます。
  • オプション:video="Decklink Video Capture":audio="Decklink Audio Capture"これらのデバイスを入力として使用するように ffmpeg に指示しますが、このように指定することで、オーディオとビデオの間の遅延が大幅に減少します (および/またはなくなります)。
  • -r 30ソースの 60fps ではなく、出力を 30fps に強制します。
  • -threads 4あなたが思うように、4 つのスレッドを使用します。
  • -vcodec libx264ブロードキャスト中にソース ストリームを h264 にエンコードします。
  • -crf 0「一定レート係数」(量子化スケール) を 0 に設定します。これはロスレスを意味します。
  • -preset ultrafast忍耐力がないことを意味するので、圧縮はできるだけ少なくしてください。これによりビットレートが高くなりますが、私の目的には問題ありません。
  • -f mpegtsオプションは、ffmpeg に MPEG-TS パケットを使用するように指示します。mpeg 自体は通常可変ビットレートであるため、これは ffmpeg に固定ビットレートの mpeg 形式を使用するように「強制」します。
  • 最後に、オプションudp://239.255.12.42:6666は、udp 経由でポート 6666 を使用して、このストリームをマルチキャスト アドレス 239.255.12.42 にブロードキャストすることを指定します。ここでマルチキャスト アドレスを使用することにした理由は、ストリーム (プレビュー) と記録を同時に表示する必要があり、できるだけ少ない処理で行う必要があるためです。これにより、オーディオ ストリームとビデオ ストリームを 2 つの異なるネットワーク アドレスにコピーする必要がなくなります。

VLC プレーヤーを使用してこのビデオをキャプチャするために、次のネットワーク ストリーミング アドレスを開きます。

udp://@239.255.12.42:6666

最後に、ストリームを記録するために、新しいプロセスを生成し、次のコマンドを発行します。

ffmpeg -y -threads 4 -i udp://239.255.12.42:6666 -map 0 -acodec copy -vcodec copy output.mkv
  • この-yオプションは、問題なく存在する場合は常にファイルを上書きするためのものです。
  • この-threads 4オプションは、あなたが考えていることを行います.4つのスレッドを使用します.
  • -i udp://239.255.12.42:6666、ブロードキャストしているストリームに接続します。
  • -map 0、すべてのストリーム (ビデオとオーディオの両方) が必要であることを ffmpeg に伝えます。
  • -acodec copyとは-vcodec copy、圧縮/トランスコーディングを行う代わりに、ストリームがそのまま取得されるようにするためにあります。

残っている唯一のこと (これは進行中の atm です) は、このための ac# gui を作成することです。基本的なワークフローは、フォームの読み込み時にストリーム プロセスを生成することです。vlc com+ コントロールを使用して、アプリケーションでビデオを表示します。

次に、記録ボタンが押されると、別のプロセスを生成して記録し、そのプロセスを停止して記録を終了します。

ただし、記録を開始するときにストリームを停止します。これにより、記録/検出がはるかにスムーズになります。ストリームがオンのままで録画を開始すると、録画プロセスがストリームに「同調」できるようになるまでに時間がかかります。ストリームを停止し、記録を開始し (ストリームが再びオンになるまで何もしません)、ストリームを再度開始すると、記録は問題なく最初のフレームからピックアップされます。

この小さな遅延/ちらつきは、私の目的にはまったく問題ありません。

于 2013-10-29T08:03:00.540 に答える