お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
技術::ffmpeg

ミキサーが使えない場合に自分のマイク入力とPCからのスピーカー出力を両方取りたいときに使える方法。

確認環境

Windows 11環境下。

Env Ver
ffmpeg 7.1.1-essentials_build-www.gyan.dev
Screen Capture Recorder 0.13.3

事前セットアップ

Chocolateyはあるものとする。

  1. ffmpegのインストール
    choco install ffmpeg
  2. Screen Capture Recorderのインストール
    GitHubのリリース一覧からインストーラーを拾ってきてインストールする

手順

  1. 録音するマイクを調べる
    ffmpeg -list_devices true -f dshow -i dummy
  2. 録音するマイクを指定して録音する(以下はマイク名が「マイク (Sound BlasterX G1)」であるケース)
    ffmpeg -f dshow -i audio="マイク (Sound BlasterX G1)" -f dshow -i audio=virtual-audio-capturer -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" output.mp3
  3. Qキーを押して終了する(Ctrl+Cだと保存されない)

おまけ

ps1ファイルをダブルクリックで実行できる環境を作っておき、以下の内容でrec.ps1みたいなものを作っておくと、ワンクリックで呼び出せる。

Write-Host "録音を開始する場合は何かキーを押してください…" -NoNewLine
[Console]::ReadKey($true) > $null

$input="マイク (Sound BlasterX G1)"
$filename=Get-Date -Format "yyyy-MM-dd_HH_mm_ss"

ffmpeg -f dshow -i audio=$input -f dshow -i audio=virtual-audio-capturer -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" "$filename.mp3"
投稿日:
技術::ffmpegネットワーク::RTP

概要

Windows 10でffmpegを使ってWebCamの内容をRTPで送受信する事について調べたので、そのログ

送信するフォーマットはH.264, G.711

ffmpeg4.1を使用

基本

  • ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url}
    • -i の前にあるものがglobal_options
      • input_file_optionsも -i の手前にある
    • -i で入力を指定
      • ファイルパスやURL、デバイスIDなどを指定できる
      • https://www.ffmpeg.org/ffmpeg.html#Main-options
    • input_urlの後ろにあるものが出力
      • 但し解釈不能なコマンドはすべて出力として扱われる
      • https://ffmpeg.org/ffmpeg-all.html#Description

結論

動作確認はしてないので注意

  • 送信側
    • ffmpeg -re -f dshow -i video="Hoge_Camera":audio="Hoge_MIC" -r 30 -c:v libx264 -an -f rtp rtp://224.0.0.255:1234 -c:a pcm_mulaw -vn -f rtp rtp://224.0.0.255:1235 -sdp_file stream.sdp
  • 受信側
    • ffplay -protocol_whitelist "file,udp,rtp" stream.sdp
      • ffplayをffmpegに変えてI/O出来るようにしてやるとファイルに落としたり再送したりできる

各オプションについて

  • -re
    • 本来のフレームレートで読み込む。指定しない場合は早送りになる?
    • ストリーミングを流したりするときに利用する、エンコードで使うと遅くなりそう
    • https://ffmpeg.org/ffmpeg.html#Advanced-options
  • -y
    • 出力ファイルの上書きを確認しない
    • https://www.ffmpeg.org/ffmpeg.html#Main-options
  • -f
    • I/Oフォーマットの指定
    • ffmpegは自動でフォーマットを検出する機能を持つが、それを無視する場合に使用する
    • https://ffmpeg.org/ffmpeg.html#Main-options
    • dshow
      • DirectShowデバイスを指定
      • https://www.ffmpeg.org/ffmpeg-devices.html#dshow
      • https://trac.ffmpeg.org/wiki/DirectShow
      • DirectShowデバイスの一覧
        • ffmpeg -list_devices true -f dshow -i dummy
          • https://www.ffmpeg.org/ffmpeg-devices.html#Examples-2
      • 入力デバイスの指定
        • TYPE=NAME[:TYPE=NAME]
        • http://ffmpeg.org/ffmpeg-devices.html#dshow
    • rtp
      • RTPを指定
  • -formats
    • -f オプションで指定できるフォーマットの一覧を表示
    • https://www.ffmpeg.org/ffmpeg.html#Generic-options
  • -r
    • フレームレートの設定
    • https://www.ffmpeg.org/ffmpeg.html#Video-Options
  • -c[:stream_specifier]
    • ストリームに対してコーデックを指定する
    • 例外的に -c copy はコーデックコピーとなる
    • https://www.ffmpeg.org/ffmpeg.html#Main-options
    • -c:v で動画の -c:a で音声のコーデックを指定できる
  • stream_specifier
    • 各種オプションで利用するストリーム識別子
    • 雑に書くと v が映像、a が音声
    • http://ffmpeg.org/ffmpeg.html#Stream-specifiers-1
  • -decoders
    • 利用可能なデコーダーの一覧
    • https://www.ffmpeg.org/ffmpeg.html#Generic-options
  • -an
    • 音声ストリームをブロックする
    • https://www.ffmpeg.org/ffmpeg.html#Audio-Options
    • 動画ストリームを切り出すのに利用
  • -vn
    • 動画ストリームをブロックする
    • https://www.ffmpeg.org/ffmpeg.html#Video-Options
    • 音声ストリームを切り出すのに利用
  • -sdp_file
    • SDPファイルを出力する
    • https://www.ffmpeg.org/ffmpeg.html#Advanced-options
    • -y オプションの有無に関わらず上書きされる
  • -protocol_whitelist "tcp, udp, ..."
    • カンマ区切りでプロトコルを指定することで、プロトコルを利用できるようになる
    • https://ffmpeg.org/ffmpeg-protocols.html#Protocol-Options
    • SDPファイルを用いてRTPストリームを受ける場合には "file,udp,rtp" を指定する
      • file
        • ローカルファイルへのアクセスプロトコル
        • https://ffmpeg.org/ffmpeg-protocols.html#file
      • udp
        • UDP
        • https://ffmpeg.org/ffmpeg-protocols.html#udp
      • rtp
        • RTP
        • https://ffmpeg.org/ffmpeg-protocols.html#rtp
      • なんでfileがいるのかは正直良くわかってない