UNPKG

hls-transcoder

Version:

A tool to easily convert videos into HLS format

155 lines (127 loc) 4.22 kB
import { VideoMetadata } from "./types" // borrowed from https://github.com/fluent-ffmpeg/node-fluent-ffmpeg /** * Parse progress line from ffmpeg stderr * * @param {String} line progress line * @return progress object * @private */ export function parseProgressLine(line: any, _metadata: VideoMetadata) { const progress: any = {} // Remove all spaces after = and trim line = line.replace(/=\s+/g, '=').trim() const progressParts = line.split(' ') // Split every progress part by "=" to get key and value for (let i = 0; i < progressParts.length; i++) { const progressSplit = progressParts[i].split('=', 2) const key = progressSplit[0] const value = progressSplit[1] // This is not a progress line if (typeof value === 'undefined') return null progress[key] = value } const progressSeconds = timemarkToSeconds(progress["time"]) const durationSeconds = _metadata.duration ? _metadata.duration : 1 progress["progress_pct"] = ((progressSeconds / durationSeconds) * 100).toFixed(2) return progress } /** * Progress data sent to stdout pipe via `-progress pipe:1` is different than when * sent to the stderr command line output with `-progress -`. * @param line * @param _metadata * @returns */ export function parseProgressStdout(line: any, _metadata: VideoMetadata) { const progress: any = {} // Remove all spaces after = and trim line = line.replace(/=\s+/g, '=').trim() const progressParts = line.split('\n') // Split every progress part by "=" to get key and value for (let i = 0; i < progressParts.length; i++) { const progressSplit = progressParts[i].split('=', 2) const key = progressSplit[0] const value = progressSplit[1] // This is not a progress line if (typeof value === 'undefined') return null progress[key] = value } const progressSeconds = timemarkToSeconds(progress["out_time"]) const durationSeconds = _metadata.duration ? _metadata.duration : 1 // Fix for when out_time is greater than duration let progressPct = ((progressSeconds / durationSeconds) * 100) if(progressPct > 100) { progressPct = 100 } progress["progress_pct"] = progressPct.toFixed(2) return progress } // TODO: implement // borrowed from https://github.com/fluent-ffmpeg/node-fluent-ffmpeg /** * Extract progress data from ffmpeg stderr and emit 'progress' event if appropriate * * @param {FfmpegCommand} command event emitter * @param {String} stderrLine ffmpeg stderr data * @private */ /* function extractProgress(command, stderrLine) { var progress = parseProgressLine(stderrLine) if (progress) { // build progress report object var ret = { frames: parseInt(progress.frame, 10), currentFps: parseInt(progress.fps, 10), currentKbps: progress.bitrate ? parseFloat(progress.bitrate.replace('kbits/s', '')) : 0, targetSize: parseInt(progress.size || progress.Lsize, 10), timemark: progress.time } // calculate percent progress using duration if (command._ffprobeData && command._ffprobeData.format && command._ffprobeData.format.duration) { var duration = Number(command._ffprobeData.format.duration) if (!isNaN(duration)) ret.percent = (utils.timemarkToSeconds(ret.timemark) / duration) * 100 } command.emit('progress', ret) } } */ /** * Parse error line from ffmpeg stderr * @param line */ export function parseErrorLine(line: string) { let error: any = {} // Remove all spaces if (line.includes('[error] ')) { return line.replace('[error] ', '') } } /** * Convert a [[hh:]mm:]ss[.xxx] timemark into seconds * * @param {String} timemark timemark string * @return Number * @private */ function timemarkToSeconds(timemark: string) { if (typeof timemark === 'number') { return timemark; } if (timemark.indexOf(':') === -1 && timemark.indexOf('.') >= 0) { return Number(timemark); } const parts = timemark.split(':'); // add seconds let secs = Number(parts.pop()); if (parts.length) { // add minutes secs += Number(parts.pop()) * 60; } if (parts.length) { // add hours secs += Number(parts.pop()) * 3600; } return secs; }