我用mp4box.js阅读了一个视频,我想在浏览器中获取这个视频的元数据,比如评论、作者等。(我最感兴趣的是评论,你可以通过使用Ctrl-I快捷键轻松地将它们添加到VLC中的视频中)。我怎么能这么做?
现在我在网上找不到任何方向。现在我只设法将https://gpac.github.io/mp4box.js/test/filereader.html中的moov > udta > meta > ilst
块的大小与我的注解的大小相关联,但二进制内容并不真正匹配,所以我猜还有另一个解析步骤,我不确定如何获得该块,然后如何解析它,对于这样一个简单的任务来说,它感觉像是一个非常复杂的解决方案。
正如注解中所解释的,mp4boxFile.onReady
不提供用户元数据:
但是如果我手动读取盒子udta
,那么我会得到更多的信息。不知何故,我发现了一个包含内容的子框,但它也包含其他信息,所以我需要知道该框的编码才能阅读它:
--> "hdlr" --> "mdir" --> "appl" --> "ilst" --> ©cmt.data:
Hey. I am a comment that I'd like to print in the browser.
I might have json structure inside like ("Hey": [1,2.3]).
R (or byte val: 0x52)
©nam
J (or byte val: 0x4A)
.dataBBH gravitational lensing of gw150914_comment_from_vlc.mp4%
--> "©too" data: Lavf58.76.108
--> "free"
下面是我使用的代码:
<!DOCTYPE html>
<html>
<head>
<title>MP4 Metadata Extraction</title>
</head>
<body>
<input type="file" id="fileInput" accept=".mp4">
<div id="metadataDisplay"></div>
<script src="https://gpac.github.io/mp4box.js/dist/mp4box.all.js"></script>
<script>
document.getElementById("fileInput").addEventListener("change", function (e) {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function (e) {
const arrayBuffer = e.target.result;
// Initialize mp4box
const mp4boxFile = MP4Box.createFile();
mp4boxFile.onReady = (info) => {
console.log("READY");
console.log(info);
};
mp4boxFile.onError = () => {
console.log("Error");
};
// Create a Blob from the ArrayBuffer
/* const blob = new Blob([arrayBuffer]);
*/
console.log("created blob");
// Read the Blob using mp4box
arrayBuffer.fileStart = 0;
mp4boxFile.appendBuffer(arrayBuffer);
// Get metadata
const udtaBoxes = mp4boxFile.getBoxes("udta");
const decoder = new TextDecoder('utf-8');
udtaBoxes.forEach((box) => {
console.log("Box ", box);
box.boxes.forEach((subbox) => {
console.log("Subbox", subbox);
if (subbox.data) {
console.log(decoder.decode(subbox.data));
}
});
});
};
reader.readAsArrayBuffer(file);
}
});
</script>
</body>
</html>
1条答案
按热度按时间wj8zmpe11#
(1)了解您的子盒
.data
输入:假设这条线:
console.log( decoder.decode(subbox.data) );
提供了以下示例文本:那么这意味着你的
subbox
变量的.data
保存了这些字节值(以十六进制格式编写):将上述字节值粘贴到十六进制编辑器中,以查看解码为文本String的字节。
PS:您可以使用
.toString(16)
检查任何字节的值(十六进制):(2)将字节解码为文本,并从中提取Object:
您的输出字符串(来自bytes/data)带有引号,这是不允许的。
必须对内部引号进行转义,方法是在每个引号前面添加一个反斜杠
\
。不使用
decoder.decode(subbox.data)
,您可以使用以下命令提取嵌入的Object:其中 “create Object from text that describes an Object” 的意思是: