Recherche avancée

Médias (91)

Autres articles (68)

  • XMP PHP

    13 mai 2011, par

    Dixit Wikipedia, XMP signifie :
    Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
    Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
    XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)

  • Creating farms of unique websites

    13 avril 2011, par

    MediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
    This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...)

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

Sur d’autres sites (7946)

  • MoviePy Create Video that keeps audio on Twitter

    26 janvier 2019, par SDS

    I’m exporting lots of videos and was planning to use them on Twitter.

    When I read the documentation the first time I (foolishly) thought I only had to worry about the dimensions and the rest would take care of itself.

    I have many files that look and play great on my PC but as soon as I load them into Twitter there is no audio.
    Twitter’s Media Best Practices are located here :

    Recommended Video Codec: H264 High Profile
    Recommended Frame Rates: 30 FPS, 60 FPS
    Recommended Video Resolution: 1280x720 (landscape), 720x1280 (portrait), 720x720 (square)
    Recommended Minimum Video Bitrate: 5,000 kbps
    Recommended Minimum Audio Bitrate: 128 kbps
    Recommended Audio Codec: AAC LC
    Recommended Aspect Ratio: 16:9 (landscape or portrait), 1:1 (square)
    Advanced:

    Frame rate must be 60 FPS or less
    Dimensions must be between 32x32 and 1280x1024
    File size must not exceed 512 mb
    Duration must be between 0.5 seconds and 140 seconds
    Aspect ratio must be between 1:3 and 3:1
    Must have 1:1 pixel aspect ratio
    Only YUV 4:2:0 pixel format is supported
    Audio must be AAC with Low Complexity profile. High-Efficiency AAC is not supported
    Audio must be mono or stereo, not 5.1 or greater
    Must not have open GOP
    Must use progressive scan

    Here’s the specs on a specific video :

    Video ----
    Length: 00:00:12
    Frame width 1280
    Frame height 720
    Data rate 238kbps
    Total bitrate 368kbps
    Frame rate 24.00 frames/second
    Audio --
    Bit rate 129 kbps
    Channels 2 (stereo)
    Audio sample rate 44.100 kHz
    File --
    Size 551 KB
    Item type MP4 File

    The code is fairly straightforward. I grab an image and make a short intro frame with it, then add two short clips and put it all together as you can see here :

    image_clip = ImageClip(my_image)   image_clip.set_duration(seconds).write_videofile('F:/sm_Temp_Files/trash_%s.mp4' % fname,fps=24)
    image_video_clip = mpy.VideoFileClip('F:/sm_Temp_Files/trash_%s.mp4' % fname)
    video_path = (my_video_path)
    video_clip = mpy.VideoFileClip(video_path, target_resolution = (h,w),audio=True)
    outro_clip = mpy.VideoFileClip('Logo_Intro_w_Stinger_Large.mp4',target_resolution = (h,w),audio=True)
    clips = [image_video_clip,video_clip,image_video_clip,video_clip,image_video_clip,outro_clip]
    slided_clips = [CompositeVideoClip([clip.fx( transfx.crossfadein, transition_seconds)]) for clip in clips]
    c = concatenate_videoclips(slided_clips)                
    c.write_videofile('F:/sm_Short_Video/sm_%s.mp4' % fname,fps=24)

    I’ll admit, I’m out of my league to know what to do next. When Googling it looks like others have had similar issues but show fixes in FFMpeg, like this example.

    Yes, I know MoviePy is written on top of FFMpeg but for a novice like me it would be really nice if there was tweaks I could do inside of MoviePy to get the audio to work on Twitter.

    Thank you in advance !

  • Need Help Making Java Script Discord Music Bot

    22 octobre 2018, par Gambino

    I have tried to use this code to make a discord music bot but i am getting error telling me i need ffmpeg, but how would I implement it into this code ?

    index.js file

    const Discord = require('discord.js');
    const bot = new Discord.Client();
    const config = require("./config.json");
    const ytdl = require('ytdl-core');

    var youtube = require('./youtube.js');


    var ytAudioQueue = [];
    var dispatcher = null;

    bot.on('message', function(message) {
       var messageParts = message.content.split(' ');
       var command = messageParts[0].toLowerCase();
       var parameters = messageParts.splice(1, messageParts.length);

       switch (command) {

           case "-join" :
           message.reply("Attempting to join channel " + parameters[0]);
           JoinCommand(parameters[0], message);
           break;
       
           case "-play" :
           PlayCommand(parameters.join(" "), message);
           break;

           case "-playqueue":
           PlayQueueCommand(message);
           break;
       }
    });


       function PlayCommand(searchTerm) {
           if(bot.voiceConnections.array().length == 0) {
               var defaultVoiceChannel = bot.channels.find(val => val.type === 'voice').name;
               JoinCommand(defaultVoiceChannel);
           }
           youtube.search(searchTerm, QueueYtAudioStream);
       }

       function PlayQueueCommand(message) {
           var queueString = "";

           for(var x = 0; x < ytAudioQueue.length; x++) {
               queueString += ytAudioQueue[x].videoName + ", ";
           }
           queueString = queueString.substring(0, queueString.length - 2);
           message.reply(queueString);
       }

       function JoinCommand(ChannelName) {
           var voiceChannel = GetChannelByName(ChannelName);

           if (voiceChannel) {
               voiceChannel.join();
               console.log("Joined " + voiceChannel.name);
           }
           
           return voiceChannel;
           
       }

       /* Helper Methods */

       function GetChannelByName(name) {
           var channel = bot.channels.find(val => val.name === name);
           return channel;
       }

     

       function QueueYtAudioStream(videoId, videoName) {
           var streamUrl = youtube.watchVideoUrl + videoId;

           if (!ytAudioQueue.length) {
               ytAudioQueue.push(
                   {
                       'streamUrl' : streamUrl,
                       'videoName' : videoName
                   }
               );
               console.log('Queued audio ' + videoName);
               PlayStream(ytAudioQueue[0].streamUrl);
           }
           else {
               ytAudioQueue.push(
                   {
                       'streamUrl' : streamUrl,
                       'videoName' : videoName
                   }
               );
           }
           console.log("Queued audio " + videoName);
       }

       function PlayStream(streamUrl) {
           const streamOptions = {seek: 0, volume: 1};

           if (streamUrl) {
               const stream = ytdl(streamUrl, {filter: 'audioonly'});

               if (dispatcher == null) {
                   var voiceConnection = bot.voiceConnections.first();

                   if(voiceConnection) {
                       console.log("Now Playing " + ytAudioQueue[0].videoname);
                       dispatcher = bot.voiceConnections.first().playStream(stream, streamOptions);

                       dispatcher.on('end', () => {
                           dispatcher = null;
                           PlayNextStreamInQueue();
                       });

                       dispatcher.on('error', (err) => {
                           console.log(err);
                       });
                   }
               } else {
                   dispatcher = bot.voiceConnections.first().playStream(stream, streamOptions);
               }
               
           }
       }

       function PlayNextStreamInQueue() {
           ytAudioQueue.splice(0, 1);

           if (ytAudioQueue.length != 0) {
               console.log("now Playing " + ytAudioQueue[0].videoName);
               PlayStream(ytAudioQueue[0].streamUrl);
           }
       }


    bot.login(config.token);

    youtube.js file

    var request = require('superagent');

    const API_KEY = "My API KEY";
    const WATCH_VIDEO_URL = "https://www.youtube.com/watch?v=";

    exports.watchVideoUrl = WATCH_VIDEO_URL;

    exports.search = function search(searchKeywords, callback) {
     var requestUrl = 'https://www.googleapis.com/youtube/v3/search' + '?part=snippet&q=' + escape(searchKeywords) + '&key=' + API_KEY;

     request(requestUrl, (error, response) => {
       if (!error && response.statusCode == 200) {

         var body = response.body;
         if (body.items.length == 0) {
           console.log("I Could Not Find Anything!");
           return;
         }
         for (var item of body.items) {
           if (item.id.kind == 'youtube#video') {
             callback(item.id.videoId, item.snippet.title);
             return;
           }
         }
       } else {
         console.log("Unexpected error!");
         return;
       }
     });

     return;

    };

    Error I am getting when I try to run code :

    Joined General

    C :\Discord Bot\node_modules\discord.js\src\client\voice\pcm\FfmpegConverterEngine.

    js:80

    throw new Error(

    ^

    Error : FFMPEG was not found on your system, so audio cannot be played. Please make
    sure FFMPEG is installed and in your PATH.

  • Adding chapters to MP4 files, and being identified on iOS 12 podcast app

    5 avril 2019, par Craig Francis

    I have an MP4 file, where I’ve added chapters via ffmpeg.

    But in the iOS 12 Podcasts app, from Apple, the chapters don’t appear. This should happen, as noted by idownloadblog.com

    Preview of how Chapters should look in iOS

    In comparison, when using QuickLook on MacOS, the list of chapters can be seen by clicking the chapters button (in the bottom right hand side of the window).

    Preview of QuickLook in MacOS

    And opening in QuickTime Player, while there isn’t a list of chapters to view, you can use the "View > Next Chapter" menu item.

    So I’m assuming this is a bug in iOS... but I’m wondering if there is another way to add chapters ? or if I’ve made a mistake ?


    My current process is to create a "ffmetadata" file, as noted in the ffmpeg documentation :

    ;FFMETADATA1
    title=Example

    [CHAPTER]
    TIMEBASE=1/1000
    START=0
    END=221913
    title=Chapter 1

    [CHAPTER]
    TIMEBASE=1/1000
    START=221913
    END=1169241
    title=Chapter 2

    https://ffmpeg.org/ffmpeg-formats.html#Metadata-1

    Then I’ve tried each of the following commands :

    ffmpeg -i 2019-01-02.mp4 -i 2019-01-02.meta -map_metadata 1 -codec copy 2019-01-02-chapters.mp4
    ffmpeg -i 2019-01-02.mp4 -i 2019-01-02.meta -map_metadata 1 2019-01-02-chapters.mp4
    ffmpeg -i 2019-01-02.mp4 -i 2019-01-02.meta -map_metadata 1 2019-01-02-chapters.mp3
    • The first one is from the ffmpeg documentation, where -codec copy means the audio file is not re-encoded.
    • The second one takes longer, while it re-encodes the audio data.
    • The third one requires re-encoding to convert it into an MP3 file (which uses ID3 tags for the chapter data).

    On a slightly unrelated note, the third party app "RSSRadio" does list the chapters, but the feature added in version 4 that allows you to "skip directly to the start of the next chapter", if the next chapter starts within the next 3 minutes, does not seem to work.