6

私は問題があります:

Android アプリで MediaRecorder を使用してカメラからデータを記録します。ファイルではなくソケットに保存します。このデータの長さは異なる場合があります。ソケット接続の反対側で、ファイルに保存します。予期せぬ瞬間に接続が中断されることがあります。Androidソケットの切断後、ffmpegを使用して受信データをデコードしようとしました。しかし、私が理解したように、このファイルには moov アトムが見つかりません。moov に関する情報を読んだことがあるので、MediaRecorder は moov アトムをファイルの最後に置くと思います。ただし、記録が中断された場合、moov atom の書き込みはスキップされました。

また、長さが不明なデータ(プログレッシブロード、ストリーミング)の場合、ファイルの先頭にmoovアトムを書き込むことができることも読みました。

自分の moov データをストリームに書き込む方法は? これには MediaRecorder を使用できますか? それとも手動で行う必要がありますか?有効な moov データを生成するには? 誰かがすでにこの問題を解決している場合は、アドバイスをお願いします..

4

1 に答える 1

5

「moov」アトムには、プレーヤーがメディアをデコードするために必要な情報が含まれています。多くの形式では、moov アトムのない mp4 または mov ファイルはただのジャンクです。

ほとんどの場合、moov は末尾に追加されます。これは、moov アトムの内容を事前に予測できないためです。これは、最初に配置され、継続的に更新されている場合でも同じです。後者の利点は、ストリームが中断または停止された場合でもファイルを再生できることです。言い換えれば、継続的に更新する必要があるため、単に開始するだけでは役に立ちません。

残念ながら、メディアの処理に関しては、Android は iOS には遠く及びません。Android ライブラリを使用してこれを解決する方法を見つけたら、私は驚かれることでしょう。特に MediaRecorder の経験はありませんが、MediaCodec クラスはこれについて何も提供しておらず、MediaRecorder のドキュメントを簡単に見てみると、ここでも同じ問題のように見えます。

今... h264 ストリームは、独自のメタデータが含まれているため、mp4 ヘッダーなしで再生できます。これにより、ソケットの反対側にあるアプリが引き続きデータを使用できるようになります。これには、Android で利用可能な ffmpeg を使用できます。単純にバイトを .h264 拡張子の付いたファイルに書き出し、転送が完了した後にそれを mp4 ファイルに多重化します。オーディオがある場合も同様です。

編集:生のh264データを送信できない場合は、mp4ファイルの「mdat」アトムで見つけることができますが、オーディオを個別に処理する必要があります。そうしないと、オーディオとビデオを区別できなくなります離れて。

于 2013-03-11T15:13:01.503 に答える