3

つまり、ビデオの録画中にカメラからバイト ストリームを取得する方法を探しています。目的は、実際の記録プロセスを停止して出力ファイルにアクセスすることなく、現在の記録の特定の部分を保存しながら継続的に記録することです。これは可能ですか、実際に録音を停止して保存して再生できるようにする必要がありますか?

ローカル ソケットと ParcelFileDescriptor クラスを介してカメラからサーバーへのライブ ストリーミングを可能にするプロジェクトとオープン ソース ライブラリを見てきました。

提案や助けをいただければ幸いです。

4

2 に答える 2

1

出力ファイルを FileDescriptor に設定します。

mRecorder.setOutputFile(getStreamFd());

次に、この関数を使用します。

   private FileDescriptor getStreamFd() {
    ParcelFileDescriptor[] pipe = null;

    try {
        pipe = ParcelFileDescriptor.createPipe();

        new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(pipe[0]),
                new FileOutputStream(getOutputFile())).start();
    } catch (IOException e) {
        Log.e(getClass().getSimpleName(), "Exception opening pipe", e);
    }

    return (pipe[1].getFileDescriptor());
}

private File getOutputFile() {
    return (new File(Environment.getExternalStorageDirectory().getPath().toString() + "/YourDirectory/filename"));
}

新しいスレッド コード:

    static class TransferThread extends Thread {
    InputStream in;
    FileOutputStream out;

    TransferThread(InputStream in, FileOutputStream out) {
        this.in = in;
        this.out = out;
    }

    @Override
    public void run() {
        byte[] buf = new byte[8192];
        int len;

        try {
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();

            out.flush();
            out.getFD().sync();
            out.close();

        } catch (IOException e) {
            Log.e(getClass().getSimpleName(),
                    "Exception transferring file", e);
        }
    }
}

マニフェスト ファイルにアクセス許可を追加することを忘れないでください。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2013-08-26T11:08:27.897 に答える
1

同様の問題があり、H264 NAL ユニットのカメラ バイト ストリームにアクセスしているときに H264 を MP4 ファイルに記録したいと考えていました (libRTMP にリダイレクトします)。次の例は大いに役立ちました (少なくとも Android 4.3 が必要です)。

http://bigflake.com/mediacodec/ <- CameraToMpegTest.java と「Android Breakout ゲーム レコーダー パッチ」の例

基本的に、Android の MediaCodec クラスは、デバイスのエンコーダー/デコーダーへの低レベルのアクセスを提供します。上記の例の関数 drainEncoder() を見てください。

  • ビデオ データが MediaMuxer に送信され、出力ファイルが作成されます。
  • encodingData ByteBuffer から H264 NAL ユニットに簡単にアクセスし、必要な方法で処理できます。

例:

int old_pos = encodedData.position();
encodedData.position(0);
byte[] encoded_array = new byte[encodedData.remaining()];
encodedData.get(encoded_array);
encodedData.position(old_pos);
于 2016-07-04T08:59:36.090 に答える