44

私はアンドロイドでライブデバイスからサーバーへのストリーミングに取り組んでいます。サーバー上でデータをバイト単位で送信できますが、サーバーVLCでの記録中にそのファイルを再生すると、MOOVアトムが見つからないと表示されます。多くの回避策の後、mp4ファイルのMOOVアトムが最終的に生成されることがわかりました。しかし、記録がライブを意味する間、サーバーでそのファイルを再生する必要があります。SPYDROIDSIPDROIDのソース コードを確認しましたが、どれも機能していません。FFMPEGmoovを使用してサーバー側にアトムを追加しようとしましたが、成功しませんでした。どうすればこれを達成できるかについて誰にもアイデアがありますか?

4

8 に答える 8

20

問題があります。「moov」ボックスは一種の目次です。すべてのコンテンツがない場合、完全な目次を作成することはできません。痛い!

MP4 に固執したい場合、および自分でファイルを作成している場合は、いわゆる断片化された MP4 ファイルとしてファイルを作成できます。断片化された MP4 ファイルには、ビデオの自己完結型の小さな断片が複数含まれており、それぞれに独自の目次があります。完全な記録が完了する前にファイルを再生できます。

MP4 に固執する必要がない場合、生の h264 ストリームをサーバーに書き込むオプションがあります。それでは、そのような目次はありません。VLC は生の h264 ストリームを再生できます。

于 2012-07-18T22:57:43.107 に答える
6

qt_faststart を実行して、moov アトムをストリームの先頭に移動します。

qt-faststart in.mp4 out.mp4
于 2012-07-18T08:57:23.130 に答える
2

MP4Box を使用して、MOOV アトムをファイルの先頭に移動し、インターリーブしてチャンクでストリーミングします。

MP4Box test.mp4 test.mp4
于 2012-12-10T14:17:28.653 に答える
1

mp4 形式では、ビデオを再生するために moov atom 情報が必要です。また、moov atom を生成するには、ビデオを終了する必要があります。記録中に mp4 ファイルを再生することはできません。 moov アトム部分。

やりたいことは、ある種のリアルタイム ストリーミング (再生中に再生) であるため、別の形式を使用する必要があります。HLS ストリーミングと mpeg-dash は、ビデオを小さなチャンク (2 秒から 10 秒) に保存してユーザーに送信します。このようにして、ユーザーは多くの完成したファイルを次々と再生します。

@Sebastian Annies が示唆したように、多くの小さな mp4 ファイルを作成して連結することは同じアプローチです。小さな完成したファイルを作成してリストとして再生するには、ここで詳細情報を取得できます。通常のmp4とどう違うの?

于 2020-09-25T13:41:26.960 に答える
-7

このライブラリをgradleに追加します:「net.ypresto.qtfaststartjava:qtfaststart:0.1.0」 をコンパイルしてから

File input = new File(path + "/input.mp4"); // Your input file
File output = new File(path + "/output.mp4"); // Your output file
try{
    if(!output.exists()) // if there is no output file we'll create one
        output.createNewFile();
    }
}catch (IOException e){
    Log.e("TAG", e.toString());
}

try{
    QtFastStart.fastStart(input, output); // Adds moov to your input
                                          // Now your output file is ready to stream!
}catch (QtFastStart.MalformedFileException m){
    Log.e("QT", m.toString());
}catch (QtFastStart.UnsupportedFileException q){
    Log.e("QT", q.toString());
}catch (IOException i){
    Log.e("QT", i.toString());
}

ここまでです

于 2016-08-23T01:47:10.787 に答える