Нет поля данных пользователя для видео, снятого с Android с помощью mp4parser в Android
Я пытаюсь записать информацию метаданных с помощью mp4parser, но в моем коде я получаю userDataBox Empty в случае видео, захваченного Android, но в случае другого видео (я проверял с загруженным видео) это не пусто, и я был успешно добавлен метаданные, моя проблема для видео, снятого на Android с пустым userdatabox. Кто-нибудь может мне помочь?
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{
}
1 ответ
Если udta (User Data Box) отсутствует, вы можете создать его. Возможно, вы захотите взглянуть на пример ChangeMetadata на github.
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(...) проверяет, действительно ли данные были вставлены между filestar и сэмплами. 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. Удачи!