MediaReader 媒体元信息读取库
必须的依赖
- FFprobe
如何构建
npm install
npm run build
API
-
Media
-
Media.ReadFromFileSync(file)
同步读取媒体文件元信息
示例:
// Read media metadata synchronized const { Media } = require('dist/index.js'); const file = ''; // file path const media = Media.ReadFromFileSync(file); console.log(media); /** Console Output: Media { video: VideoStream { index: Property { value: 0 }, start_pts: Property { value: 0 }, start_time: Property { value: 0 }, duration_ts: Property { value: 5165160 }, duration: Property { value: 86.086 }, bit_rate: Property { value: 71382367 }, nb_frames: Property { value: 5160 }, codec_name: Property { value: 'hevc' }, codec_long_name: Property { value: 'H.265 / HEVC (High Efficiency Video Coding)' }, profile: Property { value: 'Main 10' }, codec_tag_string: Property { value: 'hvc1' }, codec_tag: Property { value: '0x31637668' }, r_frame_rate: Property { value: [Ratio] }, avg_frame_rate: Property { value: [Ratio] }, time_base: Property { value: [Ratio] }, disposition: Property { value: [Object] }, tags: Property { value: [Object] }, width: Property { value: 3840 }, height: Property { value: 2160 }, coded_width: Property { value: 3840 }, coded_height: Property { value: 2160 }, has_b_frames: Property { value: 1 }, level: Property { value: 153 }, refs: Property { value: 1 }, closed_captions: Property { value: '0' }, pix_fmt: Property { value: 'yuv420p10le' }, color_range: Property { value: 'tv' }, color_space: Property { value: 'bt2020nc' }, color_transfer: Property { value: 'smpte2084' }, color_primaries: Property { value: 'bt2020' }, chroma_location: Property { value: 'topleft' }, sample_aspect_ratio: Property { value: [Ratio] }, display_aspect_ratio: Property { value: [Ratio] } }, audio: AudioStream { index: Property { value: 1 }, start_pts: Property { value: 0 }, start_time: Property { value: 0 }, duration_ts: Property { value: 4132864 }, duration: Property { value: 86.101333 }, bit_rate: Property { value: 192000 }, nb_frames: Property { value: 4037 }, codec_name: Property { value: 'aac' }, codec_long_name: Property { value: 'AAC (Advanced Audio Coding)' }, profile: Property { value: 'LC' }, codec_tag_string: Property { value: 'mp4a' }, codec_tag: Property { value: '0x6134706d' }, r_frame_rate: Property { value: [Ratio] }, avg_frame_rate: Property { value: [Ratio] }, time_base: Property { value: [Ratio] }, disposition: Property { value: [Object] }, tags: Property { value: [Object] }, sample_fmt: Property { value: 'fltp' }, sample_rate: Property { value: 48000 }, channels: Property { value: 2 }, bits_per_sample: Property { value: 0 }, channel_layout: Property { value: 'stereo' } }, format: MediaFormat { filename: Property { value: 'E:\\视频文件\\HDR视频文件\\Swordsmith.mp4' }, format_name: Property { value: 'mov,mp4,m4a,3gp,3g2,mj2' }, format_long_name: Property { value: 'QuickTime / MOV' }, nb_streams: Property { value: 2 }, nb_programs: Property { value: 0 }, start_time: Property { value: 0 }, duration: Property { value: 86.101333 }, size: Property { value: 770255991 }, bit_rate: Property { value: 71567392 }, probe_score: Property { value: 100 }, tags: Property { value: [Object] } } } */
-
Media.ReadFromFile(file)
异步读取媒体文件元信息
示例:
// Read media metadata asynchronized const { Media } = require('dist/index.js'); const file = ''; // file path Media.ReadFromFile(file) .then(media => { console.log(media); }); /** Console Output: Media { video: VideoStream { index: Property { value: 0 }, start_pts: Property { value: 0 }, start_time: Property { value: 0 }, duration_ts: Property { value: 5165160 }, duration: Property { value: 86.086 }, bit_rate: Property { value: 71382367 }, nb_frames: Property { value: 5160 }, codec_name: Property { value: 'hevc' }, codec_long_name: Property { value: 'H.265 / HEVC (High Efficiency Video Coding)' }, profile: Property { value: 'Main 10' }, codec_tag_string: Property { value: 'hvc1' }, codec_tag: Property { value: '0x31637668' }, r_frame_rate: Property { value: [Ratio] }, avg_frame_rate: Property { value: [Ratio] }, time_base: Property { value: [Ratio] }, disposition: Property { value: [Object] }, tags: Property { value: [Object] }, width: Property { value: 3840 }, height: Property { value: 2160 }, coded_width: Property { value: 3840 }, coded_height: Property { value: 2160 }, has_b_frames: Property { value: 1 }, level: Property { value: 153 }, refs: Property { value: 1 }, closed_captions: Property { value: '0' }, pix_fmt: Property { value: 'yuv420p10le' }, color_range: Property { value: 'tv' }, color_space: Property { value: 'bt2020nc' }, color_transfer: Property { value: 'smpte2084' }, color_primaries: Property { value: 'bt2020' }, chroma_location: Property { value: 'topleft' }, sample_aspect_ratio: Property { value: [Ratio] }, display_aspect_ratio: Property { value: [Ratio] } }, audio: AudioStream { index: Property { value: 1 }, start_pts: Property { value: 0 }, start_time: Property { value: 0 }, duration_ts: Property { value: 4132864 }, duration: Property { value: 86.101333 }, bit_rate: Property { value: 192000 }, nb_frames: Property { value: 4037 }, codec_name: Property { value: 'aac' }, codec_long_name: Property { value: 'AAC (Advanced Audio Coding)' }, profile: Property { value: 'LC' }, codec_tag_string: Property { value: 'mp4a' }, codec_tag: Property { value: '0x6134706d' }, r_frame_rate: Property { value: [Ratio] }, avg_frame_rate: Property { value: [Ratio] }, time_base: Property { value: [Ratio] }, disposition: Property { value: [Object] }, tags: Property { value: [Object] }, sample_fmt: Property { value: 'fltp' }, sample_rate: Property { value: 48000 }, channels: Property { value: 2 }, bits_per_sample: Property { value: 0 }, channel_layout: Property { value: 'stereo' } }, format: MediaFormat { filename: Property { value: 'E:\\视频文件\\HDR视频文件\\Swordsmith.mp4' }, format_name: Property { value: 'mov,mp4,m4a,3gp,3g2,mj2' }, format_long_name: Property { value: 'QuickTime / MOV' }, nb_streams: Property { value: 2 }, nb_programs: Property { value: 0 }, start_time: Property { value: 0 }, duration: Property { value: 86.101333 }, size: Property { value: 770255991 }, bit_rate: Property { value: 71567392 }, probe_score: Property { value: 100 }, tags: Property { value: [Object] } } } */
-
toObject()
将读取到的媒体文件元信息简化为简单的JS对象
示例:
const { Media } = require('dist/index.js'); const file = ''; // file path const media = Media.ReadFromFileSync(file); console.log(media.toObject()); /** * { video: { index: 0, start_pts: 0, start_time: 0, duration_ts: 5165160, duration: 86.086, bit_rate: 71382367, nb_frames: 5160, codec_name: 'hevc', codec_long_name: 'H.265 / HEVC (High Efficiency Video Coding)', profile: 'Main 10', codec_tag_string: 'hvc1', codec_tag: '0x31637668', r_frame_rate: '60000/1001', avg_frame_rate: '60000/1001', time_base: '1/60000', disposition: { default: 1, dub: 0, original: 0, comment: 0, lyrics: 0, karaoke: 0, forced: 0, hearing_impaired: 0, visual_impaired: 0, clean_effects: 0, attached_pic: 0, timed_thumbnails: 0, captions: 0, descriptions: 0, metadata: 0, dependent: 0, still_image: 0 }, tags: { creation_time: '2016-10-24T06:29:51.000000Z', language: 'und', handler_name: 'Video Media Handler', vendor_id: '[0][0][0][0]', encoder: 'HEVC Coding' }, width: 3840, height: 2160, coded_width: 3840, coded_height: 2160, has_b_frames: 1, level: 153, refs: 1, closed_captions: '0', pix_fmt: 'yuv420p10le', color_range: 'tv', color_space: 'bt2020nc', color_transfer: 'smpte2084', color_primaries: 'bt2020', chroma_location: 'topleft', sample_aspect_ratio: '1/1', display_aspect_ratio: '16/9' }, audio: { index: 1, start_pts: 0, start_time: 0, duration_ts: 4132864, duration: 86.101333, bit_rate: 192000, nb_frames: 4037, codec_name: 'aac', codec_long_name: 'AAC (Advanced Audio Coding)', profile: 'LC', codec_tag_string: 'mp4a', codec_tag: '0x6134706d', r_frame_rate: '0/0', avg_frame_rate: '0/0', time_base: '1/48000', disposition: { default: 1, dub: 0, original: 0, comment: 0, lyrics: 0, karaoke: 0, forced: 0, hearing_impaired: 0, visual_impaired: 0, clean_effects: 0, attached_pic: 0, timed_thumbnails: 0, captions: 0, descriptions: 0, metadata: 0, dependent: 0, still_image: 0 }, tags: { creation_time: '2016-10-24T06:29:51.000000Z', language: 'eng', handler_name: 'Sound Media Handler', vendor_id: '[0][0][0][0]' }, sample_fmt: 'fltp', sample_rate: 48000, channels: 2, bits_per_sample: 0, channel_layout: 'stereo' }, format: { filename: 'E:\\视频文件\\HDR视频文件\\Swordsmith.mp4', format_name: 'mov,mp4,m4a,3gp,3g2,mj2', format_long_name: 'QuickTime / MOV', nb_streams: 2, nb_programs: 0, start_time: 0, duration: 86.101333, size: 770255991, bit_rate: 71567392, probe_score: 100, tags: { major_brand: 'isom', minor_version: '1', compatible_brands: 'isom', creation_time: '2016-10-24T05:33:14.000000Z' } } } */
-
-
FFprobe
-
constructor()
FFprobe 构造函数
参数:
-
bin
ffprobe 可执行文件路径, 可选, 未提供时默认为 "ffprobe", 需配置PATH环境变量才可正常执行
-
-
i(file)
设置FFprobe输入文件参数: -i
参数:
-
file
输入文件路径
-
-
show_streams(show)
设置FFprobe输出流信息参数: -show_streams
参数:
-
show
类型Boolean; true 为执行, false 为不执行, 默认值: true
-
-
show_format(show)
设置FFprobe输出流信息参数: -show_format
参数:
-
show
类型Boolean; true 为执行, false 为不执行, 默认值: true
-
-
execute()
异步执行ffprobe命令, 返回Promise<JSON>对象
-
executeSync()
同步执行ffprobe命令, 返回JSON对象
-
show_entries(entries)
设置FFprobe输出信息参数: -show_entries
参数:
-
entries
类型:字符串; 默认不启用
-
-
select_streams(select)
设置FFprobe输出流信息选择参数: -select_streams
参数:
-
select
类型:字符串枚举, 可选值 "a", "v", "d", "s", 分别对应音频,视频,数据,字幕流; 默认不启用
-
-
-
Ratio
比值类, 用于封装一些标识比值的媒体属性, 例如视频的平均帧率 avg_frame_rate
-
constructor(a,b)
Ratio构造函数
参数:
-
a
比值被除数
-
b
比值除数
-
-
Ratio.ParseFromString(string_ratio, separator)
将字符串格式比值转换为Ratio对象
参数:
-
string_ratio
字符串格式比值
-
separator
比值分隔符, 可选, 默认值 "/" 和 ":"
返回值:
转换成功时返回Ratio对象, 否则返回null
示例:
const str = '30000/1001'; const ratio = Ratio.ParseFromString(str); console.log(ratio) // Ratio { a: 30000, b: 1001 }
-
-
toNumber(fixed)
将Ratio比值对象转换为数值
参数:
-
fixed
转换输出的比值数值保留的小数位数, 可选, 默认值: 2
示例:
const str = '24000/1001'; const ratio = Ratio.ParseFromString(str); console.log(ratio.toFloat()) // 23.98 console.log(ratio.toFloat(3)) // 23.976
-
-
toString(separator)
将Ratio比值对象转换为字符串格式比值
参数:
-
separator
转换输出的字符串比值分隔符, 可选, 默认值: "/"
示例:
const str = '24000/1001'; const ratio = Ratio.ParseFromString(str); console.log(ratio.toString()) // "24000/1001" console.log(ratio.toString(":")) // "24000:1001"
-
-