
Recherche avancée
Médias (39)
-
Stereo master soundtrack
17 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Audio
-
ED-ME-5 1-DVD
11 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Audio
-
1,000,000
27 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Demon Seed
26 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
The Four of Us are Dying
26 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Corona Radiata
26 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
Autres articles (60)
-
Configurer la prise en compte des langues
15 novembre 2010, parAccéder à la configuration et ajouter des langues prises en compte
Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...) -
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Possibilité de déploiement en ferme
12 avril 2011, parMediaSPIP peut être installé comme une ferme, avec un seul "noyau" hébergé sur un serveur dédié et utilisé par une multitude de sites différents.
Cela permet, par exemple : de pouvoir partager les frais de mise en œuvre entre plusieurs projets / individus ; de pouvoir déployer rapidement une multitude de sites uniques ; d’éviter d’avoir à mettre l’ensemble des créations dans un fourre-tout numérique comme c’est le cas pour les grandes plate-formes tout public disséminées sur le (...)
Sur d’autres sites (10506)
-
Convert Webrtc track stream to URL (RTSP/UDP/RTP/Http) in Video tag
19 juillet 2020, par Zeeshan YounisI am new in WebRTC and i have done client/server connection, from client i choose WebCam and post stream to server using Track and on Server side i am getting that track and assign track stream to video source. Everything till now fine but problem is now i include AI(Artificial Intelligence) and now i want to convert my track stream to URL maybe UDP/RTSP/RTP etc. So AI will use that URL for object detection. I don't know how we can convert track stream to URL.
Although there is a couple of packages like https://ffmpeg.org/ and RTP to Webrtc etc, i am using Nodejs, Socket.io and Webrtc, below you can check my client and server side code for getting and posting stream, i am following thi github code https://github.com/Basscord/webrtc-video-broadcast.
Now my main concern is to make track as a URL for video tag, is it possible or not or please suggest, any help would be appreciated.


Server.js


This is nodejs server code



const express = require("express");
const app = express();

let broadcaster;
const port = 4000;

const http = require("http");
const server = http.createServer(app);

const io = require("socket.io")(server);
app.use(express.static(__dirname + "/public"));

io.sockets.on("error", e => console.log(e));
io.sockets.on("connection", socket => {
 socket.on("broadcaster", () => {
 broadcaster = socket.id;
 socket.broadcast.emit("broadcaster");
 });
 socket.on("watcher", () => {
 socket.to(broadcaster).emit("watcher", socket.id);
 });
 socket.on("offer", (id, message) => {
 socket.to(id).emit("offer", socket.id, message);
 });
 socket.on("answer", (id, message) => {
 socket.to(id).emit("answer", socket.id, message);
 });
 socket.on("candidate", (id, message) => {
 socket.to(id).emit("candidate", socket.id, message);
 });
 socket.on("disconnect", () => {
 socket.to(broadcaster).emit("disconnectPeer", socket.id);
 });
});
server.listen(port, () => console.log(`Server is running on port ${port}`));







Broadcast.js
This is the code for emit stream(track)



const peerConnections = {};
const config = {
 iceServers: [
 {
 urls: ["stun:stun.l.google.com:19302"]
 }
 ]
};

const socket = io.connect(window.location.origin);

socket.on("answer", (id, description) => {
 peerConnections[id].setRemoteDescription(description);
});

socket.on("watcher", id => {
 const peerConnection = new RTCPeerConnection(config);
 peerConnections[id] = peerConnection;

 let stream = videoElement.srcObject;
 stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));

 peerConnection.onicecandidate = event => {
 if (event.candidate) {
 socket.emit("candidate", id, event.candidate);
 }
 };

 peerConnection
 .createOffer()
 .then(sdp => peerConnection.setLocalDescription(sdp))
 .then(() => {
 socket.emit("offer", id, peerConnection.localDescription);
 });
});

socket.on("candidate", (id, candidate) => {
 peerConnections[id].addIceCandidate(new RTCIceCandidate(candidate));
});

socket.on("disconnectPeer", id => {
 peerConnections[id].close();
 delete peerConnections[id];
});

window.onunload = window.onbeforeunload = () => {
 socket.close();
};

// Get camera and microphone
const videoElement = document.querySelector("video");
const audioSelect = document.querySelector("select#audioSource");
const videoSelect = document.querySelector("select#videoSource");

audioSelect.onchange = getStream;
videoSelect.onchange = getStream;

getStream()
 .then(getDevices)
 .then(gotDevices);

function getDevices() {
 return navigator.mediaDevices.enumerateDevices();
}

function gotDevices(deviceInfos) {
 window.deviceInfos = deviceInfos;
 for (const deviceInfo of deviceInfos) {
 const option = document.createElement("option");
 option.value = deviceInfo.deviceId;
 if (deviceInfo.kind === "audioinput") {
 option.text = deviceInfo.label || `Microphone ${audioSelect.length + 1}`;
 audioSelect.appendChild(option);
 } else if (deviceInfo.kind === "videoinput") {
 option.text = deviceInfo.label || `Camera ${videoSelect.length + 1}`;
 videoSelect.appendChild(option);
 }
 }
}

function getStream() {
 if (window.stream) {
 window.stream.getTracks().forEach(track => {
 track.stop();
 });
 }
 const audioSource = audioSelect.value;
 const videoSource = videoSelect.value;
 const constraints = {
 audio: { deviceId: audioSource ? { exact: audioSource } : undefined },
 video: { deviceId: videoSource ? { exact: videoSource } : undefined }
 };
 return navigator.mediaDevices
 .getUserMedia(constraints)
 .then(gotStream)
 .catch(handleError);
}

function gotStream(stream) {
 window.stream = stream;
 audioSelect.selectedIndex = [...audioSelect.options].findIndex(
 option => option.text === stream.getAudioTracks()[0].label
 );
 videoSelect.selectedIndex = [...videoSelect.options].findIndex(
 option => option.text === stream.getVideoTracks()[0].label
 );
 videoElement.srcObject = stream;
 socket.emit("broadcaster");
}

function handleError(error) {
 console.error("Error: ", error);
}







RemoteServer.js
This code is getting track and assign to video tag



let peerConnection;
const config = {
 iceServers: [
 {
 urls: ["stun:stun.l.google.com:19302"]
 }
 ]
};

const socket = io.connect(window.location.origin);
const video = document.querySelector("video");

socket.on("offer", (id, description) => {
 peerConnection = new RTCPeerConnection(config);
 peerConnection
 .setRemoteDescription(description)
 .then(() => peerConnection.createAnswer())
 .then(sdp => peerConnection.setLocalDescription(sdp))
 .then(() => {
 socket.emit("answer", id, peerConnection.localDescription);
 });
 peerConnection.ontrack = event => {
 video.srcObject = event.streams[0];
 };
 peerConnection.onicecandidate = event => {
 if (event.candidate) {
 socket.emit("candidate", id, event.candidate);
 }
 };
});

socket.on("candidate", (id, candidate) => {
 peerConnection
 .addIceCandidate(new RTCIceCandidate(candidate))
 .catch(e => console.error(e));
});

socket.on("connect", () => {
 socket.emit("watcher");
});

socket.on("broadcaster", () => {
 socket.emit("watcher");
});

socket.on("disconnectPeer", () => {
 peerConnection.close();
});

window.onunload = window.onbeforeunload = () => {
 socket.close();
};







-
Revision 31647 : - mettre dans une fonction séparée la recherche des connexions existantes
18 septembre 2009, par marcimat@… — Logmettre dans une fonction séparée la recherche des connexions existantes
-
Revision 29159 : Tester une autre méthode pour que le multilinguisme fonctionne à la ...
13 juin 2009, par marcimat@… — LogTester une autre méthode pour que le multilinguisme fonctionne à la création de la mutualisation. Ca me parait plus portable.