0

mp4parser を使用してメタデータ情報を書き込もうとしていますが、私のコードでは、Android でキャプチャされたビデオの場合は userDataBox Empty を取得していますが、他のビデオ (ダウンロードしたビデオでテストしました) の場合は空ではなく、メタデータが正常に追加されました。私の問題は、空のユーザーデータボックスを持つアンドロイドによってキャプチャされたビデオです。体は私を助けることができますか?

        moov.getBoxes(UserDataBox.class).size()

私のコードはここにあります:

    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
            "MYFOLDER");
    File f = new File(mediaStorageDir, "VID.mp4");
    if(f.exists())
    {
        Toast.makeText(MainActivity.this," file found",Toast.LENGTH_SHORT).show();
    }

    try {
        fc = new FileInputStream(f).getChannel();

        // fc = new FileInputStream(f).getChannel();
        isoFile = new IsoFile(fc);
        String str = f.getAbsolutePath();
        MovieBox moov = isoFile.getMovieBox();
        // for (Box box : moov.getBoxes()) {
        // System.out.println("box" + box);
        // }



        if(moov.getBoxes(UserDataBox.class).size()>0)
        {
            UserDataBox udta = moov.getBoxes(UserDataBox.class).get(0); 



        }else{

}

4

1 に答える 1

0

udta (ユーザー データ ボックス) がない場合は、作成できます。github のChangeMetadataの例をご覧になることをお勧めします。

UserDataBox userDataBox;
long sizeBefore;
if ((userDataBox = Path.getPath(tempIsoFile, "/moov/udta")) == null) {
   sizeBefore = 0;
   userDataBox = new UserDataBox();
   tempIsoFile.getMovieBox().addBox(userDataBox);
} else {
   sizeBefore = userDataBox.getSize();
}
MetaBox metaBox;
if ((metaBox = Path.getPath(userDataBox, "meta")) == null) {
   metaBox = new MetaBox();
   userDataBox.addBox(metaBox);
}


XmlBox xmlBox = new XmlBox();
xmlBox.setXml(text);
metaBox.addBox(xmlBox);

これでボックスが追加されました。残念ながら、ファイルには実際のビデオ/オーディオ サンプルを参照する他のボックスが含まれています。これらの参照はファイルの先頭に絶対的であり、ファイルの先頭と実際のオーディオ/ビデオ サンプルの間にデータを挿入した可能性があるため、調整する必要があります。

needsOffsetCorrection(...) メソッドは、ファイルスターとサンプルの間にデータが本当に挿入されたかどうかをチェックします。correctChunkOffsets(...) は、stco (ChunkOffsetBox) に格納されているオフセットを実際に修正します。

long sizeAfter = userDataBox.getSize();
if (needsOffsetCorrection(tempIsoFile)) {
    correctChunkOffsets(tempIsoFile, sizeAfter - sizeBefore);
}

videoFileOutputStream = new FileOutputStream(videoFilePath + "_mod.mp4");
tempIsoFile.getBox(videoFileOutputStream.getChannel());

MP4 と MP4 のメタデータがどのように機能するかを少し理解するのに役立つことを願っています。幸運を!

于 2014-08-23T11:40:16.790 に答える