Node.js视频上传获取Codec

问题描述 投票:0回答:2

我的用户可以将视频上传到我的网站。然而出现了一个问题,即某些视频文件的编解码器不受浏览器支持

(YUV)

所以我想研究一下如何查看编解码器。

目前我正在使用

multer
来处理我的文件:

app.use(multer({
    dest: './uploads/',
    rename: function (fieldname, filename) {
        return filename + Date.now();
    },

    onFileUploadStart: function (file) {
        var i = 0;
    },
    onFileUploadComplete: function (file) {
        //Redirects request to path
        var i = 0;
    }
}));

设置断点并检查文件是我得到的唯一信息:

所以我的问题是:有什么方法可以查看上传文件的编解码器吗?

javascript node.js video codec
2个回答
3
投票

首先,值得一提的是,YUV 是一个色彩空间而不是编解码器 - 类似于可能更容易理解的 RGB(红绿蓝)色彩空间。它是表示图像中像素的亮度和颜色的一种方式。许多编解码器使用 YUV 颜色空间,因为它简化了编解码器需要执行的计算类型并减少了冗余。

如果您确实想找到特定视频文件正在使用的编解码器以及相当多的其他信息,那么进行基本分析以查看您上传的视频的类型和格式是一项相当艰巨的任务因为有很多格式。

我认为最简单的方法是利用 ffprobe 功能(如果可以的话):

有些模块提供了 ffprobe 的包装器,以便您可以从节点使用它 - 例如:

使用这种方法可以非常简单地生成视频文件信息,然后您可以解析该信息以供编解码器使用。上述链接中的用法示例(在撰写本文时正确):

var probe = require('node-ffprobe');

var track = '/path/to/media/file.mp3';

probe(track, function(err, probeData) {
    console.log(probeData);
});

以及 ffprobe 为无处不在的 BigBuckBunny 视频示例生成的输出类型示例:

ffprobe version 2.6.1 Copyright (c) 2007-2015 the FFmpeg developers
  built with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
  configuration: --prefix=/Volumes/Ramdisk/sw --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libgsm --enable-libvidstab --enable-libx265 --disable-doc --arch=x86_64 --enable-runtime-cpudetect
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.../vid_bigbuckbunny.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2010-02-09 01:55:39
  Duration: 00:01:00.10, start: 0.000000, bitrate: 733 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 65 kb/s (default)
    Metadata:
      creation_time   : 2010-02-09 01:55:39
      handler_name    : Apple Sound Media Handler
    Stream #0:1(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 640x360, 612 kb/s, 23.96 fps, 24 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      creation_time   : 2010-02-09 01:55:39
      handler_name    : Apple Video Media Handler
    Stream #0:2(eng): Data: none (rtp  / 0x20707472), 45 kb/s
    Metadata:
      creation_time   : 2010-02-09 01:55:39
      handler_name    : hint media handler
    Stream #0:3(eng): Data: none (rtp  / 0x20707472), 5 kb/s
    Metadata:
      creation_time   : 2010-02-09 01:55:39
      handler_name    : hint media handler

ffprobe 无法识别的任何内容大多都不是视频,或者即使它是视频,也不会在常规浏览器中播放。

值得检查 ffmpeg/ffprobe 许可,以确保它也满足您的需求。


0
投票

您可以使用以下代码检测编解码器。我有类似的问题。 iPhone 中生成的一些视频采用 HEVC 编解码器。我可以使用 ffprobe 获取视频的编解码器。因为我之前安装了 ffmpeg,所以我只是使用 @ffprobe-installer/ffprobe 安装了 ffprobe 二进制文件。

const ffmpeg= require('fluent-ffmpeg');
const ffprobeInstaller = require('@ffprobe-installer/ffprobe');
ffmpeg.setFfprobePath(ffprobeInstaller.path);

/**Get codec of the video file.
 * 
 * @param {*} filePath 
 * @returns codec of the file
 */
const getCodec=(filePath)=>{
    return new Promise((resolve,reject)=>{
        try {
            
            ffmpeg.ffprobe(filePath,function(err, probeData) {
                //console.log("probeData for ",filePath,probeData,err);
                if(err)return reject(err);
                else{
                    return resolve(probeData.streams[0].codec_name);
                }
            });            
        } catch (error) {
            return reject(error);
        }        
    });
    
}
exports.getCodec=getCodec;

不仅如此,您还可以使用以下代码将编解码器更改为可播放格式。这个用的是ffmpeg。只需安装 npm Fluent-ffmpeg 即可:

ffmpeg.setFfmpegPath( require('@ffmpeg-installer/ffmpeg'));
/**Convert video to regular mp4(h.264) codec
 * 
 * @param {*} source 
 * @param {*} destination 
 * @returns 
 */
const convertVideo=(source,destination)=>{
    return new Promise((resolve,reject)=>{
        try {
            ffmpeg(source).videoCodec('libx264').output(destination).on('end', function() {                    
                console.log('conversion ended');
                return resolve(destination);
            }).on('error', function(err){
                console.log('error: ', err.code, err.msg);
                return reject(err);                
            }).run();
            
        } catch (error) {
            return reject(error);
        }        
    });    
}
exports.convertVideo=convertVideo;
© www.soinside.com 2019 - 2024. All rights reserved.