Recherche avancée

Médias (1)

Mot : - Tags -/lev manovitch

Autres articles (63)

  • Demande de création d’un canal

    12 mars 2010, par

    En fonction de la configuration de la plateforme, l’utilisateur peu avoir à sa disposition deux méthodes différentes de demande de création de canal. La première est au moment de son inscription, la seconde, après son inscription en remplissant un formulaire de demande.
    Les deux manières demandent les mêmes choses fonctionnent à peu près de la même manière, le futur utilisateur doit remplir une série de champ de formulaire permettant tout d’abord aux administrateurs d’avoir des informations quant à (...)

  • Le plugin : Gestion de la mutualisation

    2 mars 2010, par

    Le plugin de Gestion de mutualisation permet de gérer les différents canaux de mediaspip depuis un site maître. Il a pour but de fournir une solution pure SPIP afin de remplacer cette ancienne solution.
    Installation basique
    On installe les fichiers de SPIP sur le serveur.
    On ajoute ensuite le plugin "mutualisation" à la racine du site comme décrit ici.
    On customise le fichier mes_options.php central comme on le souhaite. Voilà pour l’exemple celui de la plateforme mediaspip.net :
    < ?php (...)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

Sur d’autres sites (4298)

  • Interview de l'auteur du Livre sur Piwik : Ronan Chardonneau

    20 juillet 2012, par Piwik team — Community

    Ronan Chardonneau, auteur de Piwik : L'alternative Open Source en web analytique aux éditions ENI, répond aux questions de Matthieu Aubry le créateur de Piwik !


    Qu'est ce qui t'a poussé à écrire ce livre ?

    En fait il y a eu plusieurs choses. Tout d'abord je travaille au sein d'une structure un peu spéciale, notre agence web, inextcom travaille physiquement sur un plateau regroupant la plupart des acteurs de la ville de Nantes qui utilisent des logiciels libres. Toutes ses entreprises sont adhérentes d'une association qui s'appelle Alliance Libre. Quand je suis arrivé au sein de cette structure j'étais le seul à venir du monde du webmarketing. Le webmarketing tourne beaucoup autour de Google du coup je n'étais pas forcément vu d'un très bon oeil. Du coup j'ai voulu m'ouvrir sur ce qui se passait en dehors de Google Analytics est c'est ainsi que j'ai découvert Piwik. J'ai pas mal accroché sur cette technologie car elle est très intuitive.

    Je me suis penché sur cette solution et ai décidé de la proposer en tant que formation. Quelques mois après son apparition dans notre catalogue de formation nous avons été contacté par un grand compte français pour donner un formation. J'avais vraiment à cœur de fournir une formation de qualité, en un week end mon support de cours avait dépassé les 50 pages. Je suis arrivé le lundi matin au travail et j'ai dit, les gars on va écrire un livre sur Piwik. J'ai regardé ce qui s'était déjà fait à droite à gauche et il n'y avait qu'un seul livre au monde semble t il écrit sur le sujet. Je me suis dit qu'il pouvait être intéressant de démocratiser l'outil… et au revoir jolis petits week end et bonjour les nuits blanches :)

    Je voulais également être l'un des premiers auteurs sur cette solution car trop souvent ces ouvrages sont écrits par des anciens ingénieurs ou développeurs qui ont ensuite basculé dans le monde du marketing. Dans mon cas c'est le contraire je viens du marketing et ai basculé dans l'informatique, du coup ma vision du logiciel est purement orienté sur la façon dont je vais pouvoir extraire les informations pour mon analyse et non pas l'ensemble des fonctionnalités qui ont été développées pour le logiciel.

    Combien de temps ce projet de livre Piwik a t'il pris ?

    En fait j'adore écrire, et j'ai eu l'écriture plutôt facile pour ce livre. Le temps me manquait du coup j'ai décidé de l'écrire avec l'un de mes collègues : Germain Butrot. Le plus pénible dans l'écriture est que nous ne sommes pas développeurs du coup on a perdu pas mal de temps sur des soucis d'installation. Je dirai que rédiger ce livre nous a pris deux mois de travail.

    Combien de clients as tu introduits à Piwik ?

    Pas énormément, en fait les clients ont déjà fait leur choix de cette solution avant de s'engager chez nous, simplement qu'ils ne savent pas l'installer, le configurer, gérer la base de données etc. En fait il y a les clients qui n'ont pas encore réalisé oh combien la confidentialité de leurs données est critique et qu'il est dangereux de les confier à des tiers, ce qui représente 97% des sites Internet. Les 3% restants sont des entreprises qui en effet souhaitent se rapprocher au maximum du risque 0 en ce qui concerne la confidentialité des données. Nous introduisons la plupart de nos clients à Piwik, cependant ces derniers ont au final le choix entre une solution gratuite que tout le monde utilise et un hébergement de données payant pour atteindre un niveau de sécurité qu'ils ne considèrent pas comme critique.

    Ronan séance de dédicaces

    Le web analytique étant une discipline peu enseignée en France, le plus gros du travail est de faire réaliser aux webmasters que la notion de confidentialité est extrêmement importante. Je pense sincèrement que de plus en plus d'utilisateurs migreront sur des solutions telles que Piwik, tout simplement parce que le web analytique est une discipline en développement et que l'on commence à récupérer des données de plus en plus précieuses, il va donc falloir commencer à les protéger au maximum.

    Si tu avais le droit à un vœu, quelle serait la nouvelle fonctionnalité qui te plairait le plus dans Piwik ?

    Bonne question, en fait je pense qu'il y en a deux, personnellement je souhaiterais que l'on puisse créer les rapports de son choix en sélectionnant uniquement les données désirées. Cependant je pense que la fonctionnalité qui ferait beaucoup de bien pour la démocratisation de Piwik serait de pouvoir uniquement insérer le tagging dans les pages pour que Piwik commence à récolter les données. C'est principalement ce que je décris dans le livre, l'installation de Piwik est encore assez technique pour des personnes qui n'y connaissent rien. Les gens n'ayant pas encore saisi l'importance du web analytique sont à la recherche d'un outil qui en peu d'efforts peu être installé.

    Tu as beaucoup d’expérience en web marketing. Que nous conseilles tu pour le futur en terme de Marketing pour Piwik ?

    Je pense que Piwik a un potentiel énorme tout comme la plupart des projets open source populaires. Le problème c'est que ces projets ne savent pas encore communiquer auprès des personnes spécialisées dans le marketing. Le concept de l'open source n'est pas du coup connu du monde du marketing. Ce qui fait que lorsqu'un projet open source débarque sur le marché on a l'impression que seuls des personnes avec des connaissances en développement peuvent contribuer à ce projet alors qu'il existe énormément de missions que des personnes du marketing peuvent occuper au sein d'un tel projet : traduction, réalisation de bannières publicitaires, réalisation de pages de contenu pour en faire la promotion, remontée de fonctions importantes à intégrer etc

    De tous les projets Open Source que je connais je trouve que le CMS WordPress s'en sort le mieux, l'outil est très facile à prendre en main, assez intuitif, du coup nombreux sont les personnes du marketing a s'être familiarisé avec l'outil et à en faire des retours pour des développements de modules, de templates etc au final la communauté WordPress est énorme et le nombre de plugin impressionnant.

    Pour Piwik je pense qu'il pourrait être intéressant d'interroger des utilisateurs influents dans le monde du web analytique, de les inviter à utiliser Piwik et de nous faire un retour sur les fonctionnalités éventuelles à installer.


    Le livre sera t-il traduit ?

    Le livre devrait être traduit en espagnol et disponible sur ce marché d'ici 6 mois. Concernant les autres langues je suis actuellement à la recherche de traducteurs dans toutes les autres langues. Je suis prêt à céder mes droits de traduction à un prix modique, ce qui m'intéresse avant tout c'est la démocratisation de l'outil. Aussi n'hésitez pas à me faire si vous êtes volontaire ou avez des personnes volontaires dans votre entourage.

    Y aura t-il une version 2 du livre ?

    Très certainement une version avancée du livre verra le jour dans les prochaines années, tout dépend principalement des retours qui me seront fait par rapport à cet ouvrage, les demandes de personnalisation de code dont on m'aura fait la demande, le développement de Piwik…

    Merci Ronan pour ton travail de démocratisation sur Piwik, ton livre va vraiment permettre au projet de trouver une nouvelle cible en France… et on espère voir une Version 2 du livre dans quelques mois ! Je te souhate de bonnes ventes pour le livre et bonne contination pour tous tes projets.

    Le livre est en vente sur la FNAC, Amazon.fr, le site de l'éditeur.

    A voir aussi : Grand Jeu Concours 10 Livres Piwik à gagner !

  • Convert Webrtc track stream to URL (RTSP/UDP/RTP/Http) in Video tag

    19 juillet 2020, par Zeeshan Younis

    I 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.&#xA;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.&#xA;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.

    &#xA;

    Server.js

    &#xA;

    This is nodejs server code&#xA;

    &#xD;&#xA;
    &#xD;&#xA;
    const express = require("express");&#xA;const app = express();&#xA;&#xA;let broadcaster;&#xA;const port = 4000;&#xA;&#xA;const http = require("http");&#xA;const server = http.createServer(app);&#xA;&#xA;const io = require("socket.io")(server);&#xA;app.use(express.static(__dirname &#x2B; "/public"));&#xA;&#xA;io.sockets.on("error", e => console.log(e));&#xA;io.sockets.on("connection", socket => {&#xA;  socket.on("broadcaster", () => {&#xA;    broadcaster = socket.id;&#xA;    socket.broadcast.emit("broadcaster");&#xA;  });&#xA;  socket.on("watcher", () => {&#xA;    socket.to(broadcaster).emit("watcher", socket.id);&#xA;  });&#xA;  socket.on("offer", (id, message) => {&#xA;    socket.to(id).emit("offer", socket.id, message);&#xA;  });&#xA;  socket.on("answer", (id, message) => {&#xA;    socket.to(id).emit("answer", socket.id, message);&#xA;  });&#xA;  socket.on("candidate", (id, message) => {&#xA;    socket.to(id).emit("candidate", socket.id, message);&#xA;  });&#xA;  socket.on("disconnect", () => {&#xA;    socket.to(broadcaster).emit("disconnectPeer", socket.id);&#xA;  });&#xA;});&#xA;server.listen(port, () => console.log(`Server is running on port ${port}`));

    &#xD;&#xA;

    &#xD;&#xA;

    &#xD;&#xA;&#xA;

    Broadcast.js&#xA;This is the code for emit stream(track)&#xA;

    &#xD;&#xA;
    &#xD;&#xA;
    const peerConnections = {};&#xA;const config = {&#xA;  iceServers: [&#xA;    {&#xA;      urls: ["stun:stun.l.google.com:19302"]&#xA;    }&#xA;  ]&#xA;};&#xA;&#xA;const socket = io.connect(window.location.origin);&#xA;&#xA;socket.on("answer", (id, description) => {&#xA;  peerConnections[id].setRemoteDescription(description);&#xA;});&#xA;&#xA;socket.on("watcher", id => {&#xA;  const peerConnection = new RTCPeerConnection(config);&#xA;  peerConnections[id] = peerConnection;&#xA;&#xA;  let stream = videoElement.srcObject;&#xA;  stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));&#xA;&#xA;  peerConnection.onicecandidate = event => {&#xA;    if (event.candidate) {&#xA;      socket.emit("candidate", id, event.candidate);&#xA;    }&#xA;  };&#xA;&#xA;  peerConnection&#xA;    .createOffer()&#xA;    .then(sdp => peerConnection.setLocalDescription(sdp))&#xA;    .then(() => {&#xA;      socket.emit("offer", id, peerConnection.localDescription);&#xA;    });&#xA;});&#xA;&#xA;socket.on("candidate", (id, candidate) => {&#xA;  peerConnections[id].addIceCandidate(new RTCIceCandidate(candidate));&#xA;});&#xA;&#xA;socket.on("disconnectPeer", id => {&#xA;  peerConnections[id].close();&#xA;  delete peerConnections[id];&#xA;});&#xA;&#xA;window.onunload = window.onbeforeunload = () => {&#xA;  socket.close();&#xA;};&#xA;&#xA;// Get camera and microphone&#xA;const videoElement = document.querySelector("video");&#xA;const audioSelect = document.querySelector("select#audioSource");&#xA;const videoSelect = document.querySelector("select#videoSource");&#xA;&#xA;audioSelect.onchange = getStream;&#xA;videoSelect.onchange = getStream;&#xA;&#xA;getStream()&#xA;  .then(getDevices)&#xA;  .then(gotDevices);&#xA;&#xA;function getDevices() {&#xA;  return navigator.mediaDevices.enumerateDevices();&#xA;}&#xA;&#xA;function gotDevices(deviceInfos) {&#xA;  window.deviceInfos = deviceInfos;&#xA;  for (const deviceInfo of deviceInfos) {&#xA;    const option = document.createElement("option");&#xA;    option.value = deviceInfo.deviceId;&#xA;    if (deviceInfo.kind === "audioinput") {&#xA;      option.text = deviceInfo.label || `Microphone ${audioSelect.length &#x2B; 1}`;&#xA;      audioSelect.appendChild(option);&#xA;    } else if (deviceInfo.kind === "videoinput") {&#xA;      option.text = deviceInfo.label || `Camera ${videoSelect.length &#x2B; 1}`;&#xA;      videoSelect.appendChild(option);&#xA;    }&#xA;  }&#xA;}&#xA;&#xA;function getStream() {&#xA;  if (window.stream) {&#xA;    window.stream.getTracks().forEach(track => {&#xA;      track.stop();&#xA;    });&#xA;  }&#xA;  const audioSource = audioSelect.value;&#xA;  const videoSource = videoSelect.value;&#xA;  const constraints = {&#xA;    audio: { deviceId: audioSource ? { exact: audioSource } : undefined },&#xA;    video: { deviceId: videoSource ? { exact: videoSource } : undefined }&#xA;  };&#xA;  return navigator.mediaDevices&#xA;    .getUserMedia(constraints)&#xA;    .then(gotStream)&#xA;    .catch(handleError);&#xA;}&#xA;&#xA;function gotStream(stream) {&#xA;  window.stream = stream;&#xA;  audioSelect.selectedIndex = [...audioSelect.options].findIndex(&#xA;    option => option.text === stream.getAudioTracks()[0].label&#xA;  );&#xA;  videoSelect.selectedIndex = [...videoSelect.options].findIndex(&#xA;    option => option.text === stream.getVideoTracks()[0].label&#xA;  );&#xA;  videoElement.srcObject = stream;&#xA;  socket.emit("broadcaster");&#xA;}&#xA;&#xA;function handleError(error) {&#xA;  console.error("Error: ", error);&#xA;}

    &#xD;&#xA;

    &#xD;&#xA;

    &#xD;&#xA;&#xA;

    RemoteServer.js&#xA;This code is getting track and assign to video tag&#xA;

    &#xD;&#xA;
    &#xD;&#xA;
    let peerConnection;&#xA;const config = {&#xA;  iceServers: [&#xA;    {&#xA;      urls: ["stun:stun.l.google.com:19302"]&#xA;    }&#xA;  ]&#xA;};&#xA;&#xA;const socket = io.connect(window.location.origin);&#xA;const video = document.querySelector("video");&#xA;&#xA;socket.on("offer", (id, description) => {&#xA;  peerConnection = new RTCPeerConnection(config);&#xA;  peerConnection&#xA;    .setRemoteDescription(description)&#xA;    .then(() => peerConnection.createAnswer())&#xA;    .then(sdp => peerConnection.setLocalDescription(sdp))&#xA;    .then(() => {&#xA;      socket.emit("answer", id, peerConnection.localDescription);&#xA;    });&#xA;  peerConnection.ontrack = event => {&#xA;    video.srcObject = event.streams[0];&#xA;  };&#xA;  peerConnection.onicecandidate = event => {&#xA;    if (event.candidate) {&#xA;      socket.emit("candidate", id, event.candidate);&#xA;    }&#xA;  };&#xA;});&#xA;&#xA;socket.on("candidate", (id, candidate) => {&#xA;  peerConnection&#xA;    .addIceCandidate(new RTCIceCandidate(candidate))&#xA;    .catch(e => console.error(e));&#xA;});&#xA;&#xA;socket.on("connect", () => {&#xA;  socket.emit("watcher");&#xA;});&#xA;&#xA;socket.on("broadcaster", () => {&#xA;  socket.emit("watcher");&#xA;});&#xA;&#xA;socket.on("disconnectPeer", () => {&#xA;  peerConnection.close();&#xA;});&#xA;&#xA;window.onunload = window.onbeforeunload = () => {&#xA;  socket.close();&#xA;};

    &#xD;&#xA;

    &#xD;&#xA;

    &#xD;&#xA;&#xA;

  • Permissions issue with Python and ffmpeg on a Mac

    13 avril 2020, par EventHorizon

    I am fairly new to Python ( 4 weeks), and I have been struggling with this all day.

    &#xA;&#xA;

    I am using MacOS 10.13, Python 3.7 via Anaconda Navigator 1.9.12 and Spyder 4.0.1.

    &#xA;&#xA;

    Somehow (only a noob, remember) I had 2 Anaconda environments. I don't do production code, just research, so I figured I would make life simple and just use the base environment. I deleted the other environment.

    &#xA;&#xA;

    I had previously got FFmpeg working and was able to do frame grabs, build mpeg animations, and convert them to gifs for blog posts and such. I had FFmpeg installed in the directories associated with the deleted environment, so it went away.

    &#xA;&#xA;

    No worries, I got the git URL, used Terminal to install it in /opt/anaconda3/bin. It's all there and I can run FFmpeg from the Terminal.

    &#xA;&#xA;

    My problem : When I attempt to run a module that previously worked fine, I get the following message :

    &#xA;&#xA;

    [Errno 13] Permission denied : '/opt/anaconda3/bin/ffmpeg'

    &#xA;&#xA;

    In my module I set the default location of FFmpeg : plt.rcParams['animation.ffmpeg_path'] = '/opt/anaconda3/bin/ffmpeg'

    &#xA;&#xA;

    In my module I have the following lines :

    &#xA;&#xA;

    writer = animation.FFMpegWriter(fps=frameRate, metadata=metadata)&#xA;writer.setup(fig, "animation.mp4", 100)&#xA;

    &#xA;&#xA;

    This calls matplotlib's 'animation.py', which runs the following :

    &#xA;&#xA;

    def setup(self, fig, outfile, dpi=None):&#xA;    &#x27;&#x27;&#x27;&#xA;    Perform setup for writing the movie file.&#xA;&#xA;    Parameters&#xA;    ----------&#xA;    fig : `~matplotlib.figure.Figure`&#xA;        The figure object that contains the information for frames&#xA;    outfile : str&#xA;        The filename of the resulting movie file&#xA;    dpi : int, optional&#xA;        The DPI (or resolution) for the file.  This controls the size&#xA;        in pixels of the resulting movie file. Default is fig.dpi.&#xA;    &#x27;&#x27;&#x27;&#xA;    self.outfile = outfile&#xA;    self.fig = fig&#xA;    if dpi is None:&#xA;        dpi = self.fig.dpi&#xA;    self.dpi = dpi&#xA;    self._w, self._h = self._adjust_frame_size()&#xA;&#xA;    # Run here so that grab_frame() can write the data to a pipe. This&#xA;    # eliminates the need for temp files.&#xA;    self._run()&#xA;&#xA;def _run(self):&#xA;    # Uses subprocess to call the program for assembling frames into a&#xA;    # movie file.  *args* returns the sequence of command line arguments&#xA;    # from a few configuration options.&#xA;    command = self._args()&#xA;    _log.info(&#x27;MovieWriter.run: running command: %s&#x27;, command)&#xA;    PIPE = subprocess.PIPE&#xA;    self._proc = subprocess.Popen(&#xA;        command, stdin=PIPE, stdout=PIPE, stderr=PIPE,&#xA;        creationflags=subprocess_creation_flags)&#xA;

    &#xA;&#xA;

    Everything works fine up to the last line (i.e. 'command' looks like a well-formatted FFmpeg command line, PIPE returns -1) but subprocess.Popen() bombs out with the error message above.

    &#xA;&#xA;

    I have tried changing file permissions - taking a sledgehammer approach and setting everything in /opt/anaconda3/bin/ffmpeg to 777, read, write, and execute. But that doesn't seem to make any difference. I really am clueless when it comes to Apple's OS, file permissions, etc. Any suggestions ?

    &#xA;