Я отправляю аудиоданные PCM через сокет на небольшую службу node.js, которую я тогда хочу передать с Icecast как «живой» звук. Я отправляю данные каждые 5 секунд или около того, поэтому у меня в основном есть 5 вторых клипов, которые я хочу передать поточно, как серия файлов или один файл. Основной смысл в том, что это живая запись, и я хочу передать ее, поскольку она написана.Ices/Icecast - потоковый .ogg-файл, который добавляется к
Я попытался следующие подходы:
1) Использование FFmpeg взять аудио и преобразовать его в .ogg, а затем записать FilePath в список воспроизведения файлов, чтобы обслуживать с помощью стандартного типа льды основного/playlist config - чтобы он просматривал файлы, как стандартный плейлист.
2) Используйте ffmpeg, чтобы взять аудио, преобразовать его в .ogg и передать вновь созданный .ogg-файл в главный «супер» .gg-файл и обслуживать его с помощью стандартной конфигурации/списка воспроизведения стилей ices ,
3) Просто возьмите данные PCM и проведите его до льда с помощью входа stdinpcm каждый раз, когда он будет получен (так каждые 5 секунд или около того, чтобы передать данные PCM в льды).
Независимо от того, что я пытаюсь, я могу только обрезать срез и льды. Он думает, что это сделано для создания, потоковой передачи и уничтожения консоли icecast ... и прекращает соединение с клиентом.
Я чувствую, что это, вероятно, принципиально неправильный подход, поэтому я пытаюсь понять, что делают другие люди, чтобы решить ту же проблему («chunking» несколько аудиофайлов для создания непрерывного потока).
Заранее благодарим за любую помощь!
UPDATE:
Спасибо, @ Брэд. Теперь я могу пройти аутентификацию в Icecast и запустить mount/stream. Тем не менее, если я попытаюсь просто прокормить его файловым потоком для теста, он играет странно (например, 15 секунд, затем внезапно останавливается). Поэтому я думаю, что я получаю поточную часть очень неправильно - это должно произойти в том же запросе - или новый, последующий запрос? Вот пример кода:
'use strict';
var http = require('http');
var fs = require('fs');
var options = {
host: 'iceserver_host.net',
path: '/stream.ogg',
port: '8000',
method: 'SOURCE /stream.ogg ICE/1.0',
headers: {
'Authorization': 'Basic ' + new Buffer('source:somepassword').toString('base64'),
'Content-Type': 'application/ogg',
'User-Agent': 'mysource/1.0',
'ice-name': 'Test Stream',
'ice-url': 'http://server.com',
'ice-genre': 'talk',
'ice-bitrate': '128',
'ice-private': '0',
'ice-public': '1',
'ice-description': 'Some description.'
}
};
var req = http.request(options, function(response) {
if (response.statusCode == '200') {
console.log('************* Authenticated! *************');
// this only sort of works...
var stream = fs.createReadStream('audio.ogg');
stream.pipe(req);
}
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.end();
Спасибо - что имеет смысл. Я пытался не писать клиенту, но похоже, что это единственный достойный способ сделать это. Существуют ли проблемы с подачей потока с перерывами (после первоначального подтверждения подлинности)? Я собираюсь предоставить данные потока небольшими очередями, когда я получаю их от ввода. – mercury
Сервер будет отправлять ваши закодированные данные клиентам по мере их доступности. Поскольку вы отправляете данные только каждые 5 секунд, возможно, клиентам придется перезагрузить их, но если вы отправляете 5 секунд звука каждые 5 секунд, они должны в конечном итоге проигрывать без пробелов. (Это точка буфера.) Вы можете легко обойти эту проблему, настроив Icecast с большим буфером или добавив буфер в приложение Node. Если вы поместите его на стороне узла: http://stackoverflow.com/a/20585620/362536 – Brad
Еще раз спасибо за вашу помощь! – mercury