Webrtc - kurento - ffmpeg youtube live

12
D
На сайте с 06.02.2017
Offline
17
5809

Здравствуйте, необходима связь Webrtc - kurento - rtp - ffmpeg - rtmp youtube live

Первая попловина готова Webrtc - kurento - rtp и вторя тоже работает ffmpeg - rtmp youtube live

Не могу их связать. То есть с помощью kurento генерируется sdp файл, а вот дальше не идет в ffmpeg

Если просто медиа файл ставлю в ffmpeg то трансляция запускается.

Делаю все на nodejs вот код:

pipeline.create("RtpEndpoint", {}, function(error, rtpEndpoint) {

if (error) {
console.log("Recorder problem");
return sendError(res, 500, error);
}

console.log("Creating WebRtcEndpoint");
pipeline.create('WebRtcEndpoint', function(error, webRtcEndpoint) {
if (error) {
return sendError(res, 500, error);
}

console.log("Processing sdpOffer at server and generating sdpAnswer");
webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) {
if (error) {
webRtcEndpoint.release();
return sendError(res, 500, error);
}

console.log("Connecting loopback");
webRtcEndpoint.connect(webRtcEndpoint, function(error) {
if(error){
webRtcEndpoint.release();
return sendError(res, 500, error);
}
console.log("Sending sdpAnswer to client");
console.log(sdpAnswer);

webRtcEndpoint.connect(rtpEndpoint, function(error) {
if(error) {
webRtcEndpoint.release();
return sendError(res, 500, error);
}
rtpEndpoint.generateOffer(function(error, offer) {
fs.writeFile('test.sdp',offer);
console.log("RTP OFFER GENERATED.");
});
});

res.type('application/sdp');
res.send(sdpAnswer);
});
});
});

var fs = require('fs'),
ffmpeg = require('fluent-ffmpeg');
// open input stream
var infs = fs.createReadStream('test.sdp');

infs.on('error', function(err) {
console.log(err);
});

// create new ffmpeg processor instance using input stream
// instead of file path (can be any ReadableStream)
var proc = ffmpeg(infs)
.preset('flashvideo')
// setup event handlers
.on('end', function() {
console.log('done processing input stream');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save('rtmp://a.rtmp.youtube.com/live2/key-youtube-live');


});

Может кто-то уже делал подобное, помогите разобраться пожалуйста, что не так.

Вообще смысл всего, организовать прямую трансляцию с помощью webrtc (брать изображение с камеры пк, ноута или смартфона) и отправлять на rtmp youtube live

Это некий аналог hengauts on air

D
На сайте с 31.01.2017
Offline
15
#1

Так и открывайте test.sdp сразу в ffmpeg:

var ffmpegProc = ffmpeg('test.sdp')...

Только ffmpeg стартуйте когда файл создан:

rtpEndpoint.generateOffer(function(error, offer) { 
fs.writeFile('test.sdp',offer);
ffmpegProc.save('rtmp://a.rtmp.youtube.com/live2/key-youtube-live')
});
D
На сайте с 06.02.2017
Offline
17
#2

А можно чуть подробнее код, если не сложно, я и так вроде его запускаю после создания и сразу в ffmpeg

D
На сайте с 31.01.2017
Offline
15
#3

Мне кажется вы путаете - "я и так вроде его запускаю после создания". js язык асинхронный и в приведенном вами коде ffmpeg может запуститься раньше.

Сначала нужно инициализировать ffmpeg (перенесите этот код выше места запуска kurento):


// в linux среде, лучше '/tmp/test.sdp' или путь до каталога куда есть права на запись.
var sdpFile = 'test.sdp';
var ffmpegProc = ffmpeg(sdpFile)
.preset('flashvideo')
// setup event handlers
.on('end', function() {
console.log('done processing input stream');
})
.on('error', function(err, stdout, stderr) {
console.log('an error happened: ' + err.message);
// Здесь мы увидим подробную ошибку ffmpeg
console.log(stderr);
}) ;

Обратите внимание что ffmpegProc.save() не вызывается, иначе ffmpeg запустится, а файла test.sdp еще нет. Еще модифицировал .on('error').

Далее запускаете kurento, весь код цитировать не буду, просто замените. И в этом месте уже запускается ffmpeg:

rtpEndpoint.generateOffer(function(error, offer) {
// создается файл
fs.writeFile(sdpFile, offer, (err) => {
// запускается ffmpeg
ffmpegProc.save('rtmp://a.rtmp.youtube.com/live2/key-youtube-live');
console.log("RTP OFFER GENERATED.");
});
});

В первом примере я тоже допустил ошибку, ffmpeg надо запускать в колбэке записи файла.

Ну и не забудьте добавить проверку ошибок. Возможно файл не сможет создаться.

Можно проверить пошагово, без ffmpeg. Запустите из консоли (подразумевается что тестируете локально):

ffplay путь_до_файла_test.sdp Если все в порядке, увидите окно с трансляцией.

Еще, для упрощения тестирования, в ffmpegProc.save() можно указать файл, например test.mp4. В него запишется трансляция.

D
На сайте с 06.02.2017
Offline
17
#4

Вот такую ошибку синтаксиса дает https://yadi.sk/i/84omHTHl3DAJAn

D
На сайте с 31.01.2017
Offline
15
#5

У вас очень старая версия node.js.

Замените

fs.writeFile(sdpFile, offer, (err) => {

на

fs.writeFile(sdpFile, offer, function (err) {

D
На сайте с 06.02.2017
Offline
17
#6
demiux:

Можно проверить пошагово, без ffmpeg. Запустите из консоли (подразумевается что тестируете локально):
ffplay путь_до_файла_test.sdp Если все в порядке, увидите окно с трансляцией.
Еще, для упрощения тестирования, в ffmpegProc.save() можно указать файл, например test.mp4. В него запишется трансляция.

И так тоже не работает, но я не локально, пробую, может поэтому, хотя если обычный файл из папки беру то в консоли воспроизводит, а sdp просто вот так делает https://yadi.sk/i/WHrKMPWW3DANcc тоесть ничего не происходит, а дает сново строку с вводом команды.

---------- Добавлено 06.02.2017 в 15:51 ----------

И еще вот такую ошибку дает https://yadi.sk/i/obUvU8Gj3DARcD

---------- Добавлено 06.02.2017 в 15:53 ----------

Когда я пробовал из консоли запускать такую же ошибку давал, видимо тут еще как-то не так генерируется sdp

D
На сайте с 31.01.2017
Offline
15
#7
drugoidodi:
Когда я пробовал из консоли запускать такую же ошибку давал, видимо тут еще как-то не так генерируется sdp

Да, похоже нет файла.

Добавьте проверку:

rtpEndpoint.generateOffer(function(error, offer) {

// создается файл
fs.writeFile(sdpFile, offer, function (err) {
if(err) {
console.error('SDP FILE ERROR', err);
return;
}
// запускается ffmpeg
ffmpegProc.save('rtmp://a.rtmp.youtube.com/live2/key-youtube-live');
console.log("RTP OFFER GENERATED.");
});
});
D
На сайте с 06.02.2017
Offline
17
#8

Да, файл генеририруется вот его содержимое

v=0

o=- 3695375855 3695375855 IN IP4 185.46.8.152
s=Kurento Media Server
c=IN IP4 185.46.8.152
t=0 0
m=audio 53330 RTP/AVPF 96 0 97
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:96 opus/48000/2
a=rtpmap:97 AMR/8000
a=mid:audio0
a=ssrc:2908289080 cname:user2623756476@host-7f49804b
m=video 33134 RTP/AVPF 102 103
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:102 VP8/90000
a=rtpmap:103 H264/90000
a=mid:video0
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=rtcp-fb:102 ccm fir
a=rtcp-fb:103 nack
a=rtcp-fb:103 nack pli
a=rtcp-fb:103 ccm fir
a=ssrc:711795367 cname:user2623756476@host-7f49804b
D
На сайте с 31.01.2017
Offline
15
#9

Покажите вывод ffmpeg -i файл

D
На сайте с 06.02.2017
Offline
17
#10

Вот такой? https://yadi.sk/i/C7t0y4UQ3DAu6o

з.ы. Не сочтите за наглость, но я Вам в скайп стукнул :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий