My users are allowed to upload videos to my site. However an issue came up that some of the video files have a Codec that is not supported by browsers (YUV)
.
So I want to look into how I can see the codec.
At the moment I'm using multer
to process my files:
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;
}
}));
Setting a breakpoint and inspecting the file the only information I get:
So my question is: Is there any way to see the codec of an uploaded file?
Firstly, it is worth saying that YUV is a color space rather than a codec - similar to the maybe more easily understood RGB (Red Green Blue) color space. It is a way of representing the brightness and color of the pixels in an image. Many codecs use the YUV color space because it facilitates the type of computations that codecs need to do and it reduces redundancy.
If you do want to find the codec(s) that a particular video file is using, along with quite a bit of other information, then doing a basic analysis to see what type and format of video you have uploaded is quite a hard task as there are so many formats.
I would think the easiest way to do this is to leverage ffprobe functionality if you can:
There are modules that provide a wrapper around ffprobe so you can use it from node - for example:
Using this approach allows you very simply generate video file info which you can then parse for the codec. A usage example from the above link (correct at time of writing):
var probe = require('node-ffprobe');
var track = '/path/to/media/file.mp3';
probe(track, function(err, probeData) {
console.log(probeData);
});
And and example of the type of output that ffprobe produces for an example of the ubiquitous BigBuckBunny video:
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
Anything that ffprobe fails to recognise is mostly like not a video or if it is a video it is not going to play in a regular browser anyway.
Its worth checking the ffmpeg/ffprobe licensing to make sure it meets your needs also.