Я использую ffprobe
для поиска позиции на mp3-файлах, и это работает нормально. Вот как я делаю это в своей оболочке ffprobe
node.js:
seek = function (fpath, seconds) {
var self = this;
return new Promise((resolve, reject) => {
//ffprobe -i /myfile.mp3 -show_frames -show_entries frame=pkt_pos -of default=noprint_wrappers=1:nokey=1 -hide_banner -loglevel panic -read_intervals 20%+#1
var loglevel = self.logger.isDebug() ? 'debug' : 'panic';
const args = [
'-hide_banner',
'-loglevel', loglevel,
'-show_frames',//Display information about each frame
'-show_entries', 'frame=pkt_pos',// Display only information about byte position
'-of', 'default=noprint_wrappers=1:nokey=1',//Don't want to print the key and the section header and footer
'-read_intervals', seconds + '%+#1', //Read only 1 packet after seeking to position 01:23
'-print_format', 'json',
'-v', 'quiet',
'-i', fpath
];
const opts = {
cwd: self._options.tempDir
};
const cb = (error, stdout) => {
if (error)
return reject(error);
try {
const outputObj = JSON.parse(stdout);
return resolve(outputObj);
} catch (ex) {
self.logger.error("seek failed %s", ex);
return reject(ex);
}
};
cp.execFile('ffprobe', args, opts, cb)
.on('error', reject);
});
}//seek
Таким образом, чтобы найти указанную startTime
позицию в секундах, вы делаете
seek(path,startTime)
и тогда вы получите эквивалент в байтах, смотрящий на пакет первых кадров в frames
, например:
position = function() {
if(this.raw.frames) {
if(this.raw.frames.length>0) {// get first stream ref
if(this.raw.frames[0].pkt_pos) {// get first stream ref
return this.raw.frames[0].pkt_pos;
}
}
}
return '';
}//position
Итак, при поиске файла mp3
все работает нормально, а запрос диапазона -
rangeBytes bytes=80685-8000685 {
"url": "",
"path": "",
"raw": {
"frames": [
{
"pkt_pos": "80685"
}
]
}
} {
"url": "",
"path": "",
"raw": {
"frames": [
{
"pkt_pos": "8000685"
}
]
}
}
проблема в том, что когда я использую это для файла wave
, получаемый запрос диапазона для файла wave
:
rangeBytes bytes=768058-76800058 {
"url": "",
"path": "",
"raw": {
"frames": [
{
"pkt_pos": "768058"
}
]
}
} {
"url": "",
"path": "",
"raw": {
"frames": [
{
"pkt_pos": "76800058"
}
]
}
}
не будет работать в стандартном аудиоплеере HTML5.
Примечание
Команда ffprobe
командной строки, которую я использую с оберткой выше, была:
ffprobe -i /myfile.mp3 -show_frames -show_entries frame=pkt_pos -of default=noprint_wrappers=1:nokey=1 -hide_banner -loglevel panic -read_intervals 20%+#1
Я предполагаю, что это относится как к mp3
, так и к wave
файлам.