【问题标题】:How to read metadata from mp4 using mp4.js node module?如何使用 mp4.js 节点模块从 mp4 读取元数据?
【发布时间】:2015-11-19 12:21:39
【问题描述】:

我正在尝试使用节点模块mp4js 将 mp4 文件中的元数据标签读入我的 javascript。我遵循了该页面上提供的模型,但出现了一些问题。

我尝试了以下方法:

var mp4 = require('mp4js');

mp4({ file: 'small.mp4', type: 'local' }, function (err, tags) {
    // tags now contains your MP4 tags
    console.log('Tags: ' + tags)
    $scope.mp4Tags = tags;
});

我遇到了Uncaught TypeError: Cannot read property 'join' of undefined

有人知道我在这里缺少什么吗?难道mp4没有标签?我刚刚用谷歌搜索“示例 mp4”并下载了一些东西。这是我第一次尝试这个模块,我对 node 还很陌生。

我也愿意接受有关阅读 mp4 元数据的其他建议。

非常感谢您抽出宝贵的时间,如果您需要我的任何补充,请告诉我。

编辑 8.26.2015

按照 Brad 的建议,我尝试使用以下代码从 mp4 读取元数据:

    var child_process = require('child_process');
ls = child_process.spawn('ffmpeg/bin/ffprobe.exe', ['-print_format', 'json', 'out.mp4']);

ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
    $scope.mp4data = data;
});

我按照this example 创建了mp4.out,用于在命令行中使用ffmpeg 添加标题元标记。 Here is a screenshot of my output。这是我输入的命令:

ffmpeg -i in.avi -metadata title="my title" out.flv

使用上面的代码运行我的应用程序后,$scope.mp4data 中存储的值是 looks like this 的 Native Buffer。我看到的只是一些数字,但没有元数据标签。如何查看我使用上述命令设置的标题等元数据?我在争论中遗漏了什么吗?或者我应该看看data以外的东西?

感谢您的帮助。由于焦点已经转移,我可能会将此作为一个新问题发布。

编辑:解决方案

感谢 Brad 的帮助,我来到了这里:

$scope.mp4data = "";
ls.stdout.on('data', function (data) {
    $scope.mp4data = $scope.mp4data + data.toString();
});

ls.stdout.on('end', function (data) {
    $scope.mp4data = JSON.parse($scope.mp4data);
});

非常适合从我的 mp4 读取元数据!谢谢布拉德!

【问题讨论】:

    标签: javascript node.js metadata mp4


    【解决方案1】:

    我建议使用 FFprobe(来自 FFmpeg 项目)来代替。它支持许多容器,包括 MP4。

    您可以使用 ffprobe -print_format json 让它输出您可以在 Node.js 应用程序中解析的 JSON 数据。

    这里有一些例子:https://stackoverflow.com/a/8191228/362536

    【讨论】:

    • 感谢您与我们联系! FFmpeg 命令是否输入到命令行?有没有办法从我的javascript中调用ffprobe -print_format json之类的东西?
    • @user95227 是的,是的。只需生成一个子进程并从其 STDOUT 流中读取,直到它结束。 nodejs.org/api/child_process.html
    • 对不起,我刚回到这个。比如:require('child_process').spawn()ls = spawn('ffprobe -print_format json', ['small.mp4']);ls.stdout.on('data', function (data) {console.log('stdout: ' + data);$scope.mp4data = data;});
    • @user95227 不,您需要将所有参数放在参数数组中,您不能要求并将其放在任何地方。 var child_process = require('child_process'); child_process.spawn('/path/to/ffprobe', ['-print_format', 'json', 'small.mp4']);类似的东西
    • 感谢您的快速回复!好的,我提取了从 FFmpeg 站点下载的 tar 文件的内容。所以现在我把路径输入为 var child_process = require('child_process'); child_process.spawn('ffmpeg-2.7.2/ffprobe.c', ['-print_format', 'json', 'small.mp4']); 。路径应该以这样的 C 文件结尾吗?另外,child_process 是标准 node.js 的一部分,而不是我需要正确使用 npm install 的东西?
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多