web-dev-qa-db-ja.com

Windows 7を使用してデッキリンクカードから720pでオーディオとビデオをキャプチャ(および記録)するためのffmpegコマンドライン

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

ffmpeg -list_devices true -f dshow -i dummy

[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 Video Capture"

[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 Audio Capture"

[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

これは、デッキリンクカードの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で今すぐ開こうとしても、エラーも警告も表示されず、ビデオも表示されません。

もう少し読む時間です。

15
Huron

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

ビデオを取得して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)は、このためのc#guiを作成することです。基本的なワークフローは、フォームがロードされたときにストリームプロセスを生成することです。アプリケーションでビデオを表示するには、vlc com +コントロールを使用します。

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

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

この小さな遅延/ちらつきは、私の目的には完全に受け入れられます。

31
Huron