最近、ユニット内のユーザーから、ユーザーが提供したプロモーション ビデオをユニット内の 9 台の Android スマート TV (Xiaomi TV) で同時に再生したいというリクエストがあり、すべてのテレビの音声とビデオを同時に再生できるようにしたいと考えています (テレビは 1 台にあります)。食堂に設置し、内蔵スピーカーを使用します。テレビ間の音声遅延が異なると残響が発生する可能性があります)。
テレビ設置時に電源コードしか確保されていなかったため、HDMIスプリッターを使用するにはケーブルの引き回しが必要であったのと、無線同画面システムの購入価格が比較的高かったため、最終的にHDMIスプリッターを使用することにしました。同社の既存無線LANインフラを調査し、無線LAN上にストリーミングメディアサーバーを構築し、スマートTVにストリーミングメディアプレーヤーをインストールしてサーバー上の動画をリアルタイムに視聴する。
テスト後、RTSP+UDP プロトコルを使用して 1080P 25 フレーム/秒のビデオを再生すると、各 TV はオーディオとビデオの同期を達成でき、その効果は HDMI スプリッターに匹敵します。このソリューションの実装プロセスを共有しましょう。
この記事のアイデアによれば、ワイヤレス ネットワークを介して複数のテレビに社内テレビ局やプロモーション ビデオをリアルタイムに放送するシナリオを実現できます。もちろん、具体的なアプリケーションの効果は実際の環境にも依存します。企業のネットワーク環境とマルチメディア機器の構成。
1. ネットワークチャネルのデバッグ
デスクトップ コンピュータをストリーミング メディア サーバーとして機能させ、LAN への有線アクセスを使用します。IP アドレスは静的に割り当てられ、DHCP は使用しないことに注意してください。テレビは無線アクセスを使用し、IP は動的にすることができますが、IP アドレスを動的にする必要があります。 NAT を経由せずにストリーミング メディア サーバーに ping を実行できます。
2. EasyDarwinの設定
テストの結果、RTMP ストリーミングを使用すると、テレビ間のオーディオとビデオの遅延が大きく異なります。これは、RTMP プロトコルが TCP 送信を使用し、ネットワーク環境の影響を受けやすいためです。ストリーミングのプッシュに RTSP (UDP) を使用すると、最良の効果が得られます。 。
ストリーミング メディア サーバーには多くのオプションがあり、EasyDarwin に加えて、Live555、Nginx (+ RTMP プラグイン)、SRS、OBS、VLC、rtsp-simple-server などがあります。ストリーミングコンポーネントとサーバー. ffmpeg なしで単独で使用することもできますが、テストした結果、OBS は RTSP プラグインをあまりサポートしていません; VLC ストリーミングはビデオのループ再生にいくつかの問題があるため、最終的に国産のオープンソース EasyDarwin を選択しました。
注: rtsp-simple-server も使用できます。rtsp-simple-server には Web 管理がなく、使用するシステム リソースが少なく、ネットワーク セキュリティ リスクが低くなります。
1. EasyDarwin をダウンロードし、システム (Win または Linux) に応じて対応するリリース パッケージを選択します。
リリース · EasyDarwin/EasyDarwin (github.com)
2.ダウンロード完了後、解凍します。
(1) EasyDarwin では、RTSP はデフォルトのポート 554 を使用します。これは easydarwin.ini で変更できます。ここでは 8554 に変更されています。
(2) EasyDarwin.exeを実行してサービスを開始します。
3.ffmpegの設定
FFmpeg は、オーディオ ファイルとビデオ ファイルの処理に使用できるクロスプラットフォームの無料ソフトウェアです。オーディオおよびビデオ データを処理するためのライブラリとツールのセットを提供し、オーディオおよびビデオのデコード、エンコード、変換、インターセプト、マージなどの操作を実行でき、複数のオーディオおよびビデオ形式をサポートします。FFmpeg は、ストリーミング メディア サーバー、ビデオ編集ソフトウェア、プレーヤーなどを含むマルチメディア関連のアプリケーションおよびシステムで広く使用されています。
オーディオおよびビデオの開発に従事している学生は、ffmpeg に精通している必要があります。関連する使用法はここでは繰り返しません。この記事では、ffmpeg は主にストリームを EasyDarwin にプッシュするために使用され、EasyDarwin は RTSP ストリームをスケジュールして TV プレーヤーに配信します。
1.ffmpegをダウンロードする 公式サイトから対応するシステムバージョンを選択してダウンロードします。
2. ダウンロードした圧縮パッケージを D:/ に解凍し、解凍したフォルダーの名前を ffmpeg に変更します。
3. シェルで ffmpeg コマンドを直接呼び出すには、ユーザーとシステムの Path 環境変数に「D:\ffmpeg\bin」を追加します。
4. プッシュフローのテスト
(1) テスト前に EasyDarwin を起動します。前のセクションを参照してください。
(2) プッシュする必要があるビデオ ファイル (video.mp4) を D:\share\ に置きます
(3) シェルを開いて次のように入力します。
ffmpeg -re -stream_loop -1 -i "D:\share\video.mp4" -c copy -f rtsp rtsp://127.0.0.1:8554/live
で、
-re
: 入力ファイルをリアルタイム モードで読み取ります。つまり、入力ストリームは通常の速度で読み取られます。-stream_loop -1
: 手動で停止するまで入力ファイルをループします。-i "D:\share\video.mp4"
:プッシュするビデオファイルのパスを指定します。-c copy
: エンコードまたはデコード操作を実行せずに、元のデータを出力ストリームに直接コピーします。ビデオのビットレートが大きい場合、解像度やフレームレートの圧縮などの操作が必要になります。-f rtsp
: 出力ストリームの形式を RTSP として指定します。デフォルトでは、データ ストリームの送信に UDP が使用され、制御ストリームの送信に TCP が使用されます。rtsp://127.0.0.1:8554/live
: 出力ストリームの URL を指定します。ストリーミング サーバーと ffmpeg は同じ端末上にあるため、ここでは 127.0.0.1 を使用できますが、別々の場合は、ここの IP を EasyDarwin を実行しているマシンの IP に変更する必要があります。
コマンドを実行すると、ジャンプ フレーム レートと時間が下部に表示され、EasyDarwin へのストリームが正常に起動されたことがわかります。この時点で、セッションの開始は EasyDarwin インターフェイスで確認でき、EasyDarwin Web インターフェイスhttp://127.0.0.1:10008/にアクセスして詳細情報を表示できます。
4. ストリーミングのためにスマート TV に VLC をインストールする
テスト後、Android スマート TV (Xiaomi TV) では、OPlayer と VLC (v3.5.4 ベータ版を使用し、他のバージョンはテストされインストールに失敗しました) の両方で安定した RTSP ストリーミング再生を実現できますが、次の問題に注意する必要があります。
- 単一のビデオ ループ再生を実装するだけの場合は、oplayer で十分です。
- 複数のビデオを何度もループする (リスト ループ) 必要がある場合は、次のセクションのスクリプトを使用できます。このとき、VLC プレーヤーを使用し、VLC のループ モードを 1 つのビデオ ループに設定する必要があります (動画右下の3つをクリック ボタンをクリックすると「ループモード」が点灯します) この設定は記憶可能で、一度設定することができます(ループはOPlayerでも設定できますが、ループモードは記憶できません)再生終了後も毎回操作が必要なので面倒です)
注: Android スマート TV では、VLC のデフォルトは TV バージョンの UI になっており、ストリーミング メディアの再生モジュールが深く隠されているため、素早い操作が困難です。次の方法を使用して改善できます。
(1) ワイヤレスキーボードとマウスを使用して、受信モジュールをスマート TV の USB ポートに挿入します。
(2) VLC で: [設定] > [インターフェイス] > [Android TV インターフェイス] のチェックを外します この時点で、マウスを使用してスライダーをドラッグして設定を変更する必要があります。
(1) VLC を使用している場合は、VLC で [詳細] > [新しいストリーミング] に、前のセクションで設定した RTSP アドレスを入力します。このとき、前の手順の 127.0.0.1 をストリーミング メディア サーバーの IP に置き換える必要があります。ネットワーク。たとえば、ストリーミング メディア サーバーの IP は 172.16.0.2、ポートは 8554、パスは /live です。
rtsp://172.16.0.2:8554/live
(2) OPlayer を使用している場合、操作は同様なので繰り返しません。
5. ストリーミングコマンドの最適化
4 番目のステップでプッシュをテストするときに使用したコマンドは、オーディオとビデオのエンコード操作を実行しませんでした。プッシュ ソース ファイルの解像度/フレーム レート/ビット レートが大きい場合、ネットワークとデバイスのパフォーマンス上の理由により遅延が発生する可能性があります。あるいは完全にプレイ不可能な場合もあります。
以下は実稼働環境でテストされたプッシュ コマンドです。このコマンドは、最大解像度を 1920×1080、フレーム レートを 25fps、平均ビット レートを 1500K に制限します。再生を避けるため、エンコード品質はより高速にプリセットされています。高解像度のビデオを再生すると、途切れが発生します。
ffmpeg -re -stream_loop -1 -i "D:\share\video.mp4" -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/tv
その中で、元のプッシュコマンドを最適化するために次のパラメータが追加されました
-
-vf
パラメータ: ビデオフィルターを適用します。 -
-c:v libx264
パラメータ: ビデオ エンコーダを libx264 として指定します。 -
-preset faster
パラメータ: エンコード速度と圧縮率のバランスを設定します。-preset には、特定の環境に応じて調整できる複数のオプションがあります。ここでは Faster を使用します。 -
-tune zerolatency
パラメータ: レイテンシを短縮するためにエンコーダのパラメータを設定します。 -
-vb 1500K
パラメータ: ビデオ ビット レートを 1500Kbps に設定します。
注1:
-vf
次のオプションはパラメータで指定されます。scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25で:
scale
: 入力ビデオを指定されたサイズに拡大縮小します。w
と はh
出力ビデオの幅と高さを表し、min
この関数は出力ビデオのアスペクト比が入力ビデオと一致することを保証する最小値を選択するために使用されます。force_original_aspect_ratio
: スケーリングされたビデオのアスペクト比が入力ビデオと同じであることを指定します。decrease
:ビデオをズームすると、サイズを縮小することはできますが、サイズを拡大することはできないことを示します。fps
:出力ビデオのフレームレートを25fpsに指定します。
注2:
-preset
オプションのパラメータは次のとおりです。
- 超高速 - 最も速いプリセットで、エンコード速度を高めるためにビデオ品質を犠牲にします。
- superfast - より高速なエンコード速度が必要だが、品質の多少の低下は許容できる状況向けの高速プリセットです。
- Veryfast - より高速なエンコード速度が必要だが、高いビデオ品質を維持する必要がある状況向けの高速プリセット。
- より高速 - より高速なエンコード速度が必要だが、高品質を維持する必要がある状況向けの高速プリセット。
- 高速 - 良好なビデオ品質を維持する必要があるが、より高速なエンコード速度が必要な状況向けに、適度に高速なプリセット。
- 中 - エンコード速度とビデオ品質のバランスをとるためのデフォルトのプリセット。
- 遅い - より高いビデオ品質が必要だが、より遅いエンコード速度が許容される状況向けの、より遅いプリセット。
- より遅い - より遅いプリセット。より高いビデオ品質が必要だが、より遅いエンコード速度が必要な場合に使用されます。
- Veryslow - 最も遅いプリセット。最高のビデオ品質が必要だが、最も遅いエンコード速度でも許容できる場合に使用されます。
6. 付録: リストループスクリプト、デスクトップライブストリーミングスクリプト
一部のアプリケーション シナリオでは、複数のプロモーション ビデオをループで再生したり、ローカル コンピューターのデスクトップをプッシュしたり、マイクを使用してライブ ブロードキャストをしたりする必要があります。この場合、ffmpeg を操作するための PowerShell スクリプトを作成できます。スクリプトは次のとおりです。下に:
1. 複数の動画をループ(リストループ)
# 设置视频文件夹路径
$folderPath = "D:\share\"
# 查找支持的视频文件格式
$supportedExtensions = ".mp4",".m4a",".3gp",".flv",".mov"
# 获取所有支持的视频文件
$videoFiles = Get-ChildItem -Path $folderPath -File | Where-Object {$_.Extension -in $supportedExtensions}
# 显示即将推流的文件列表
echo $videoFiles
# 获取视频文件数量
$videoCount = $videoFiles.Count
# 判断视频文件数量
if ($videoCount -eq 1) {
# 只有一个视频文件
ffmpeg -re -stream_loop -1 -i $($videoFiles.FullName) -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/live
} elseif ($videoCount -ge 2) {
# 有多个视频文件
$currentIndex = 0
do {
$currentVideo = $videoFiles[$currentIndex]
$nextIndex = ($currentIndex + 1) % $videoCount
$nextVideo = $videoFiles[$nextIndex]
ffmpeg -re -i $($currentVideo.FullName) -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/live
# 计算下一个视频的索引
$currentIndex = $nextIndex
} while ($true)
}
上記のスクリプトを .ps1 ファイルとして保存し、右クリックして [PowerShell で実行] を選択すると、ターゲット フォルダー内のすべてのビデオ ファイルのループ プッシュと再生が実行されます。この時点では、ストリームをプルするには VLC を使用する必要があることに注意してください。ループ モードを設定します (前の手順を参照)。スクリプトを実行する前に EasyDarwin を実行する必要があります。ビデオ ソース ファイルを更新する必要がある場合は、ビデオ ファイルを D:\share\ ディレクトリに置き、スクリプトを閉じて再度実行します。
2. コンピュータのデスクトップにストリーミングし、コンピュータのマイクを使用して音声を入力します。これは、ライブクラスやその他のシナリオに適しています。
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -vcodec libx264 -preset ultrafast -tune zerolatency -acodec aac -f rtsp rtsp://127.0.0.1:8554/live
このうち、audio="Microphone (Realtek High Definition Audio)" は、コンピュータのオーディオ入力デバイスの名前に置き換える必要があります。名前がわからない場合は、次を使用できます
ffmpeg -list_devices true -f dshow -i dummy
利用可能なオーディオ入力デバイスをすべてリストします。