2014-02-10 2 views
1

Я отправляю аудиоданные 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(); 

ответ

0

У меня есть приложение, которое делает то же самое, receiving PCM data from WebSocket clients and sending to SHOUTcast/Icecast servers. Мой подход состоит в том, чтобы взять чередующиеся образцы, отправить их в FFmpeg для кодирования (через STDIO), взять результат из FFmpeg и отправить его непосредственно на сервер SHOUTcast/Icecast в качестве потока. Я написал исходные клиенты для обоих серверов в JavaScript.

Этот подход работает очень хорошо. Оба Icecast и SHOUTcast легко взаимодействовать с:

+0

Спасибо - что имеет смысл. Я пытался не писать клиенту, но похоже, что это единственный достойный способ сделать это. Существуют ли проблемы с подачей потока с перерывами (после первоначального подтверждения подлинности)? Я собираюсь предоставить данные потока небольшими очередями, когда я получаю их от ввода. – mercury

+0

Сервер будет отправлять ваши закодированные данные клиентам по мере их доступности. Поскольку вы отправляете данные только каждые 5 секунд, возможно, клиентам придется перезагрузить их, но если вы отправляете 5 секунд звука каждые 5 секунд, они должны в конечном итоге проигрывать без пробелов. (Это точка буфера.) Вы можете легко обойти эту проблему, настроив Icecast с большим буфером или добавив буфер в приложение Node. Если вы поместите его на стороне узла: http://stackoverflow.com/a/20585620/362536 – Brad

+0

Еще раз спасибо за вашу помощь! – mercury

Смежные вопросы