22

私はすでに適切な調査を行っていますが、達成したいことに関する情報はまだありません。

そのため、ユーザーがビデオを録画し、そのビデオを RTP/RTSP サーバーに即座に (ライブで) アップロードできるアプリケーションをプログラムしたいと考えています。サーバー側は問題ありません。私が不明なのは、電話側でこれを達成する方法です。

これまでの私の調査では、録画時にビデオをファイルではなくローカル ソケットに書き込む必要があるということです。これは、ファイルに書き込まれた場合、3gp ファイルはファイナライズされるまでアクセスできないためです (ビデオが停止し、ヘッダー情報が保持されている場合)。長さなどについては動画に書いてあります)。

ソケットが連続データを受信したら、それを RTP パケットにラップしてリモート サーバーに送信する必要があります。最初に基本的なエンコーディングを行う必要があるかもしれません (これはまだそれほど重要ではありません)。

この理論がこれまでのところ正しいかどうか、誰にもわかりません。また、特にビデオをオンザフライでサーバーに送信するために、誰かが同様のアプローチのコードスニペットをいくつか教えてくれるかどうかも知りたいです。その方法はまだわかりません。

どうもありがとうございました。

4

7 に答える 7

12

全体的なアプローチは正しいように聞こえますが、考慮すべき点がいくつかあります。

そのため、ユーザーがビデオを録画し、そのビデオを RTP/RTSP サーバーに即座に (ライブで) アップロードできるアプリケーションをプログラムしたいと考えています。

  • コンテンツを複数のクライアントに再配布できるように、RTSP サーバーにアップロードしたいと思いますか?
  • RTSP サーバーへの RTP セッションのシグナリング/セットアップをどのように処理しますか? 適切なRTP/RTCPソケットなどを開くことができるように、ユーザーがライブメディアをアップロードしようとしていることを何らかの方法でRTSPサーバーに通知する必要があります.
  • 認証をどのように処理しますか? 複数のクライアント デバイス?

これまでの私の調査では、録画時にビデオをファイルではなくローカル ソケットに書き込む必要があるということです。これは、ファイルに書き込まれた場合、3gp ファイルはファイナライズされるまでアクセスできないためです (ビデオが停止し、ヘッダー情報が保持されている場合)。長さなどについては動画に書いてあります)。

RTP/RTCP を介してリアルタイムでフレームを送信するのが正しいアプローチです。キャプチャ デバイスは各フレームをキャプチャするため、フレームをエンコード/圧縮してソケット経由で送信する必要があります。3gp は、mp4 と同様に、ファイル ストレージに使用されるコンテナー形式です。ライブ キャプチャの場合、ファイルに書き込む必要はありません。これが意味をなすのは、メディアが HTTP 経由で提供される前にトランスポート ストリームまたは mp4 ファイルに書き込まれる HTTP ライブ ストリーミングまたは DASH アプローチなどの場合のみです。

ソケットが連続データを受信したら、それを RTP パケットにラップしてリモート サーバーに送信する必要があります。最初に基本的なエンコーディングを行う必要があるかもしれません (これはまだそれほど重要ではありません)。

エンコーディングは非常に重要であり、それ以外の方法でビデオを送信することはおそらく不可能であり、コスト (モバイル ネットワーク経由) や、解像度とフレームレートに応じた膨大な量のメディアなどの問題に対処する必要があります。 .

この理論がこれまでのところ正しいかどうか、誰にもわかりません。また、特にビデオをオンザフライでサーバーに送信するために、誰かが同様のアプローチのいくつかのコードスニペットを教えてくれるかどうかも知りたいです。その方法はまだわかりません。

出発点として、 spydroidオープン ソース プロジェクトを見てみましょう。エンコーダーの構成方法、RTP へのパケット化、RTCP の送信、RTSP サーバー機能など、必要な手順の多くが含まれています。Spydroid は、VLC などの RTSP クライアントを使用して RTSP セッションをセットアップすると、メディアがエンコードされて送信されるように RTSP サーバーをセットアップします。あなたのアプリケーションは、サーバーにメディアを送信したい電話ユーザーによって駆動されるため、送信を開始する別のアプローチを検討する必要がある場合があります。たとえば、spydroid のような RTSP セッションをセットアップするために、サーバーに何らかのメッセージを送信する場合でも同様です。 .

于 2013-12-04T20:51:33.303 に答える
1

この時点で、カメラ ( raw ストリーム ) を受け入れてすぐに一連のクライアントが利用できるようにする必要がある場合は、Google ハングアウト ルートに移動して WebRTC を使用します。ツールセット/SDK については、 ondelloの「プラットフォーム セクション」を参照してください。評価中に、WebRTC と RTSP の比較メリットを確認する必要があります。

ステートフルな IMO である RTSP は、ファイアウォールの背後にある NAT を使用したナイトウェアになります。3G/4G での私の知る限り、サードパーティのアプリで RTP を使用するのは少し危険です。

そうは言っても、 netty と「efflux」のライブラリを使用して、古い android/rtp/rtsp/sdpプロジェクトを git に入れました。このプロジェクトは、当時 RTSP 用にエンコードされていた Youtube ビデオから、コンテナ内のオーディオ トラック (vid トラックは無視され、ネットワーク経由でプルされていない) のみを取得して再生しようとしていたと思います。パケットとフレームのヘッダーに問題があり、RTSP にうんざりしてドロップしたと思います。

RTP / RTSPを追求する必要がある場合、他のポスターが言及したパケットおよびフレームレベルのもののいくつかは、Androidクラスと流出に伴うテストケースにあります

于 2013-12-09T23:58:23.730 に答える
1

クライアント側で 3gp を使用する理由はありますか? mp4 (MOOV アトムがヘッダーに設定されている) を使用すると、一時ファイルをチャンクで読み取ってサーバーに送信できますが、わずかな時間の遅延が発生する可能性がありますが、すべて接続速度にも依存します。rtsp サーバーは、低帯域幅で表示するために mp4 を 3gp に再エンコードできるはずです。

于 2013-12-04T17:37:22.397 に答える
0

この回答を確認してください: WIFI 経由のビデオ ストリーミング?

Android フォンでライブ ストリーミングを見たい場合は、アプリケーション内に vlc プラグインを含め、リアルタイム ストリーミング プロトコル (rtsp) を介して接続します。

Intent i = new Intent("org.videolan.vlc.VLCApplication.gui.video.VideoPlayerActivity");
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse("rtsp://10.0.0.179:8086/")); 
startActivity(i);

AndroidフォンにVLCをインストールしている場合は、インテントを使用してストリーミングし、上記のようにIPアドレスとポート番号を渡すことができます.

于 2013-12-10T09:14:45.543 に答える