1

私は、2 つの Android フォン間でライブ ビデオ ストリーミングの Android アプリケーションを作成しています。これらのデバイス間のソケット接続は既に確立しています。あるデバイスでビデオをキャプチャし、ストリームを他のデバイスに送信していますが、現在は受信側のモバイル デバイスに保存して保存したいだけです。私は1つのデバイスで使用して記録しているので、データを設定してオブジェクトMediaRecorderを使用しているレシーバーにストリーミングしますparcelfiledescriptor

クライアント側のコード

    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
    mediaRecorder.setOutputFile(pfd.getFileDescriptor());

受信側コード

  pfd= ParcelFileDescriptor.fromSocket(s);
  InputStream in = new FileInputStream(pfd.getFileDescriptor()); 
  DataInputStream clientData = new DataInputStream(in);  
  OutputStream newDatabase = new FileOutputStream(file);
  int available=in.available();
  byte[] buffer = new byte[available];
  int length;


                while((length = in.read(buffer)) > 0)
                {
                    newDatabase.write(buffer, 0, length);

                }
                newDatabase.close();

ビデオ ファイルは受信側のモバイルで作成されていますが、バイトを受信できません。送信されたビデオストリームは記録中にエンコードされるため、受信側で次のストリームをデコードする必要がありますか。では、受信したストリームをデコードするにはどうすればよいですか? MediaExtractor や MediaCodec などのソリューションを見つけました...しかし、これはライブ ビデオ キャプチャで機能しますか?さらに、バージョン 2.3.6android version 2.3.6 GingerBread からビデオ ストリームをデコードすることMediaCodecは可能ですか、または他の方法が利用可能ですか?

4

1 に答える 1

2

ビデオ ファイルは受信側のモバイルで作成されていますが、バイトを受信できません。

私の理解が正しければ、ソケットからデータを取得していません。これは別の問題であり、ビデオ形式、デコード、またはエンコードとは関係ありません。

ソケットをデバッグするには、受信したデータをダンプするだけの別のアプリケーションを使用すると役立つ場合があります。データに問題がないように見えたら、次のステップであるビデオのデコードに進むことができます。


問題の 2 番目の部分は、ビデオ形式です。ストリーミングに使用できない mp4 を使用しています。フォーマット構造の詳細については、こちらをご覧ください。mp4 を使用してビデオをローカル ファイルに記録し、ファイル全体をソケット経由でどこかに転送できますが、ソケットの非シーク性のため、真のリアルタイム ストリーミングは実行できません (リンクされた記事で説明されているように)。ファイルの先頭には「目次」として機能するメタデータのブロックがあり、それがなければ、以前のデータはただのジャンクです。問題は、すべてのコンテンツを取得した後にのみ「目次」を組み立てることができることです。しかし、その時点で、データはすでにソケットを介して送信されており、先頭に何も挿入することはできません。

回避策はほとんどありませんが、それは将来の調査のためのものであり、私はまだそれらを使用していません.

最も直感的な方法は、mp4 から、ストリーミング用に設計されたコンテナーである mpeg-ts に切り替えることです。MediaRecorder.OutputFormat値が 8の隠し定数を見てみましょう。

もう 1 つのオプションは、生の H.264 データを RTP/RTCP パケットにパックすることです。これもストリーミング用に設計されたプロトコルです。また、アプリケーションは、このプロトコルをサポートする任意のデバイス (VLC を実行している PC など) にストリーミングできます。さらに詳しく調べるには、Spydroid IP cameraを見てください。

于 2013-10-07T21:00:44.397 に答える