2011-09-14 18 views
14

MediaRecorderを使用して、実際の記録を行う前に、setOutputFile()を使用して外部ストレージ上のファイルにビデオを記録しています。MediaRecorderがファイルへのデータの書き込みを終了したときの方法

すべてはうまくいきますが、主な問題は、録画が終了すると、録画済みのビデオをVideoViewで再生することです。

ファイルをいつ読み込んで再生する準備ができているかを知るには?

答えて

18

FileObserverクラスは、あなたのニーズに完全に合っています。 Here is the documentation。その使いやすい。書き込み後に観測ファイルが閉じられると、CLOSE_WRITEをパラメータとしてonEventコールバックが呼び出されます。

MyFileObserver fb = new MyFileObserver(mediaFile_path, FileObserver.CLOSE_WRITE); 
fb.startWatching(); 

class MyFileObserver extends FileObserver { 

    public MyFileObserver (String path, int mask) { 
     super(path, mask); 
    } 

    public void onEvent(int event, String path) { 
     // start playing 
    } 
} 

いけない)。.. stopWatching()を呼び出すためにかかわらず、記録mediaRecorder.stop(の大きさの私のテストで

+0

私は今これをテストすることができませんが、MediaRecorderが書き込みの間にファイルを閉じることが保証されているかどうか知っていますか? –

+0

これは認識していません。しかし、それがあっても、メンバーの記録状態を維持し、onEventでそれをチェックすることができます。録画が一時停止されている場合は、イベントを無視してください。 – Ronnie

+0

真。私はこれが最善の解決策だと思う、ありがとう! –

0

Media Playerで録画が停止したときを検出する方法はありませんが、MediaRecorderを実装するカスタムクラスを作成すると上書きできるstop()があります。ここで私はこのような何かをするだろう:

public class MyRecorder implements MediaRecorder { 
    public boolean stopped; 

    .... implement all the methods that MediaRecorder has making 
     sure to call super for each method. 

    @Override 
    public void myStop() { 
     this.stopped = true; 
     super.stop(); 
    } 
} 

その後、あなたはそれが記録を停止したかどうかを確認するために、ブールにアクセスすることができます。

+1

しかし、録画を停止すると、より多くのデータをストレージに書き込む必要があり、実際に録画がストレージに書き込まれるまで、ビデオの再生を開始できません。 –

+0

何を書かなければならないのですか?あなたが書いているものがそのカスタムであれば、オーバーライドされたstopメソッドの中からカスタム関数を呼び出し、呼び出しの後に停止した変数を設定します。 – JPM

+2

私たちが録音を止めた時点を知っています。録音が停止すると、レコーダーはデータをディスクに書き込み、データの書き込みが終了したら知りたいのです。 –

0

汚れた方法は、ファイルの値がlastModified()であることを確認し、ファイルが2秒間修正されなかった場合はVideoViewを開くことです。

+0

すでにハックが発生していますが、それがあれば適切な解決法が必要です。もし何もないならば、我々はちょうど私たちのハックを使い続け、いくつかのエラーを追加するでしょう:) –

5

我々は、次のアルゴと同様の問題を解決:

while (file not complete) 
    sleep for 1 sec 
    read the fourth byte of the file 
    if it is not 0 (contains 'f' of the 'ftyp' header) then 
     file is complete, break 

キーポイントはMediaRecorderは非常に最後の瞬間にFTYPボックスを書き込みことです。それが所定の位置にある場合、ファイルは完成しています。

+0

これは有望です!おかげさまでこれをやります。 –

1

私はこれを自分で試していないが、これはうまくいくかもしれない:

ので、公共ボイドリリース():このMediaRecorderオブジェクトに関連付けられたAPIレベル1

リソースを解放します。 MediaRecorderを使用してこのメ​​ソッドを呼び出すことをお勧めします。

これは、あなたがこれを呼び出すと、このメソッドを返した後、ファイルが準備ができていることを知ったと思います。

+0

本当ですか?私はリソースを解放してGCに対処させただけだと考えていました。また、多くのクリップを記録するので、毎回MediaRecorderを再構築するとパフォーマンスが低下する可能性があります。私はそれをさらに調査するつもりです、ありがとう! –

1

を忘れると、ファイルが完全に書き込まれるとによって閉じられた後にのみ返すブロッキング方法であり、メディアレコーダー。

実際、JPMの回答は正しいです。

これを確認するには、stop()の直後にFile.length()を呼び出します。出力ファイルの長さは、この時点でのファイルの最終的な長さです。言い換えれば、メディアレコーダーは、stop()が戻った後でファイルに何も書き込まない。

0

私はxamarinで同じ問題を抱えていましたが、これらのすべてのソリューションを試しました(灰色のソリューションを除く)。私が最後にこの問題を解決するために行ったのは、Resetの前とReleaseが呼び出される前に、releaseMediaRecorder()関数で以下の関数を呼び出すことでした。

関連する問題