Recherche avancée

Médias (2)

Mot : - Tags -/rotation

Autres articles (97)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • ANNEXE : Les plugins utilisés spécifiquement pour la ferme

    5 mars 2010, par

    Le site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)

  • Personnaliser les catégories

    21 juin 2013, par

    Formulaire de création d’une catégorie
    Pour ceux qui connaissent bien SPIP, une catégorie peut être assimilée à une rubrique.
    Dans le cas d’un document de type catégorie, les champs proposés par défaut sont : Texte
    On peut modifier ce formulaire dans la partie :
    Administration > Configuration des masques de formulaire.
    Dans le cas d’un document de type média, les champs non affichés par défaut sont : Descriptif rapide
    Par ailleurs, c’est dans cette partie configuration qu’on peut indiquer le (...)

Sur d’autres sites (9711)

  • Sending per frame metadata with H264 encoded frames

    21 septembre 2013, par user2459280

    We're looking for a way to send per frame metadata (for example an ID) with H264 encoded frames from a server to a client.

    We're currently developing a remote rendering application, where both client and server side are actively involved.
    The server renders a high quality image with all effects, lighting etc.
    The client also has model-informations and renders a diffuse image that is used when the bandwidth is too low or the images have to be warped in order to avoid stuttering .

    So far we're encoding the frames on the server side with ffmpeg and streaming them with live555 to the client, who receives an rtsp-stream and decodes the frames again using ffmpeg.

    For our application, we now need to send per frame metadata.
    We want the client to tell the server where the camera is right now.
    Ideally we'd be able to send the client's view matrix to the server, render the corresponding frame and send it back to the client together with its view matrix. So when the client receives a frame, we need to know exactly at what camera position the frame was rendered.

    Alternatively we could also tag each view matrix with an ID, send it to the server, render the frame and tag it with the same ID and send it back. In this case we'd have to assign the right matrix to the frame again on the client side.

    After several attempts to realize the above intent with ffmpeg we came to the conclusion that ffmpeg does not provide the required functionality. ffmpeg only provides a fix, predefined set of fields for metadata, that either cannot store a matrix or can only be set for every key frame, which is not frequently enough for our purpose.

    Now we're considering using live555. So far we have an on demand Server, witch gets a VideoSubsession with a H264VideoStreamDiscreteFramer to contain our own FramedSource class. In this class we load the encoded AVPacket (from ffmpeg) and send its data-buffer over the network. Now we need a way to send some kind of metadata with every frame to the client.

    Do you have any ideas how to solve this metadata problem with live555 oder another library ?

    Thanks for your help !

  • "File doesn't exist" - streamio FFMPEG on screenshot after create method

    3 mai 2013, par dodgerogers747

    I have videos being directly uploaded to S3 using Amazon's CORS configuration. Videos are uploaded via a dedicated S3 form, once they have been uploaded successfully the URL of the video is appended to the @video.file hidden_field via javascript and then the video saves.

    I can't get this after_save method to work which takes a screenshot of the video and saves it to S3 via carrierwave after the video has been saved as a rails object. ( It was previously working using a carrierwave video upload instance )

    It errors out withErrno::ENOENT - No such file or directory - the file 'http://bucket-name.s3.amazonaws.com/uploads/video/file/secure-random-hex/video_name.m4v' does not exist: I have tried running this method as a class method to call it from the console but it always comes back with the same error, even though the video exists.

    My bucket is set to public, read and write. How come it doesn't think the file exists ?

    If anyone needs more code just shout, thanks in advance.

    application trace

    Started POST "/videos" for 127.0.0.1 at 2013-05-03 10:48:07 -0700
    Processing by VideosController#create as JS
     Parameters: {"utf8"=>"✓", "authenticity_token"=>"MAHxrVcmPDtVIMfDWZBwL0YnzaAaAe1PTGip5M4OVoY=", "video"=>{"user_id"=>"5", "file"=>"http://bucket-name.s3.amazonaws.com/uploads/video/file/secure-random-hex/video.m4v"}}
     User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 LIMIT 1
      (0.1ms)  BEGIN
     SQL (20.5ms)  INSERT INTO `videos` (`created_at`, `file`, `question_id`, `screenshot`, `updated_at`, `user_id`) VALUES ('2013-05-03 17:48:07', 'http://teebox-network.s3.amazonaws.com/uploads/video/file/secure-random-hex/video.m4v', NULL, NULL, '2013-05-03 17:48:07', 5)
      (44.0ms)  ROLLBACK
    Completed 500 Internal Server Error in 71ms

    Errno::ENOENT - No such file or directory - the file 'http://teebox-network.s3.amazonaws.com/uploads/video/file/secure-random-hex/video.m4v' does not exist:
     (gem) streamio-ffmpeg-0.9.0/lib/ffmpeg/movie.rb:10:in `initialize'
     app/models/video.rb:25:in `new'
     app/models/video.rb:25:in `take_screenshot'

    video.rb

     attr_accessible :user_id, :question_id, :file, :screenshot
     belongs_to :question
     belongs_to :user

     default_scope order('created_at DESC')

     after_create :take_screenshot

     mount_uploader :screenshot, ImageUploader

     validates_presence_of :user_id, :file

     def take_screenshot
       FFMPEG.ffmpeg_binary = '/opt/local/bin/ffmpeg'
       movie = FFMPEG::Movie.new("#{self.file}")
       self.screenshot = movie.screenshot("#{Rails.root}/public/uploads/tmp/screenshots/#{File.basename(self.file)}.jpg", seek_time: 2 )
       self.save!
     end

    videos/_form.html.erb

    <form action="http://bucket-name.s3.amazonaws.com" data-remote="true" class="direct-upload" enctype="multipart/form-data" method="post">
     <input type="hidden" />
     <input type="hidden" value="ACCESS_KEY" />
     <input type="hidden" value="public-read" />
     <input type="hidden" />
     <input type="hidden" />
     <input type="hidden" value="201" />
     <input type="file" />
    </form>

    &lt;%= form_for @video, html: { multipart: true, id: "new_video" }, remote: true do |f| %>
           &lt;% if @video.errors.any? %>
       <div>
       <h2>&lt;%= pluralize(@video.errors.count, "error") %> prohibited this post from being saved:</h2>

     <ul>
       &lt;% @video.errors.full_messages.each do |msg| %>
           <li>&lt;%= msg %></li>
           &lt;% end %>
       </ul>
       </div>
    &lt;% end %>

       &lt;%= f.hidden_field :user_id, value: current_user.id %>
       &lt;%= f.hidden_field :file %><br />

       &lt;% end %>

    ImageUploader

    class ImageUploader &lt; CarrierWave::Uploader::Base

     include CarrierWave::RMagick

      include Sprockets::Helpers::RailsHelper
      include Sprockets::Helpers::IsolatedHelper

     storage :fog

     before :store, :remember_cache_id
     after :store, :delete_tmp_dir

       def cache_dir
         Rails.root.join(&#39;public/uploads/tmp/&#39;)
       end

       def remember_cache_id(new_file)
         @cache_id_was = cache_id
       end

       def delete_tmp_dir(new_file)
         if @cache_id_was.present? &amp;&amp; @cache_id_was =~ /\A[\d]{8}\-[\d]{4}\-[\d]+\-[\d]{4}\z/
           FileUtils.rm_rf(File.join(root, cache_dir, @cache_id_was))
         end
       end

     process resize_and_pad: [306, 150, &#39;#000&#39;]

     def store_dir
       "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
     end

     def extension_white_list
       %w(jpg)
       # %w(ogg ogv 3gp mp4 m4v webm mov)
     end
  • ffmpeg takes a while to start

    17 octobre 2020, par Suspended

    I have this command in python script, in a loop :

    &#xA;

    ffmpeg -i somefile.mp4 -ss 00:03:12 -t 00:00:35 piece.mp4 -loglevel error -stats&#xA;

    &#xA;

    It cuts out pieces of input file (-i). Input filename, as well as start time (-ss) and length of the piece I cut out (-t) varies, so it reads number of mp4 files and cuts out number of pieces from each one. During execution of the script it might be called around 100 times. My problem is that each time before it starts, there is a delay of few seconds and it adds up to significant time. How can I get it to start immediately ?

    &#xA;

    The script (process_videos.py) :

    &#xA;

    import subprocess&#xA;import sys&#xA;import math&#xA;import time&#xA;&#xA;class TF:&#xA;    """TimeFormatter class (TF).&#xA;This class&#x27; reason for being is to convert time in short&#xA;form, e.g. 1:33, 0:32, or 23 into long form accepted by&#xA;mp4cut function in bash, e.g. 00:01:22, 00:00:32, etc"""&#xA;&#xA;def toLong(self, shrt):&#xA;    """Converts time to its long form"""&#xA;    sx = &#x27;00:00:00&#x27;&#xA;    ladd = 8 - len(shrt)&#xA;    n = sx[:ladd] &#x2B; shrt&#xA;    return n&#xA;&#xA;def toShort(self, lng):&#xA;    """Converts time to short form"""&#xA;    if lng[0] == &#x27;0&#x27; or lng[0] == &#x27;:&#x27;:&#xA;        return self.toShort(lng[1:])&#xA;    else:&#xA;        return lng&#xA;&#xA;def toSeconds(self, any_time):&#xA;    """Converts time to seconds"""&#xA;    if len(any_time) &lt; 3:&#xA;        return int(any_time)&#xA;    tt = any_time.split(&#x27;:&#x27;)&#xA;    if len(any_time) &lt; 6:            &#xA;        return int(tt[0])*60 &#x2B; int(tt[1])&#xA;    return int(tt[0])*3600 &#x2B; int(tt[1])*60 &#x2B; int(tt[2])&#xA;&#xA;def toTime(self, secsInt):&#xA;    """"""&#xA;    tStr = &#x27;&#x27;&#xA;    hrs, mins, secs = 0, 0, 0&#xA;    if secsInt >= 3600:&#xA;        hrs = math.floor(secsInt / 3600)&#xA;        secsInt = secsInt % 3600&#xA;    if secsInt >= 60:&#xA;        mins = math.floor(secsInt / 60)&#xA;        secsInt = secsInt % 60&#xA;    secs = secsInt&#xA;    return str(hrs).zfill(2) &#x2B; &#x27;:&#x27; &#x2B; str(mins).zfill(2) &#x2B; &#x27;:&#x27; &#x2B; str(secs).zfill(2)&#xA;&#xA;def minus(self, t_start, t_end):&#xA;    """"""&#xA;    t_e = self.toSeconds(t_end)&#xA;    t_s = self.toSeconds(t_start)&#xA;    t_r = t_e - t_s&#xA;    hrs, mins, secs = 0, 0, 0&#xA;    if t_r >= 3600:&#xA;        hrs = math.floor(t_r / 3600)&#xA;        t_r = t_r - (hrs * 3600)&#xA;    if t_r >= 60:&#xA;        mins = math.floor(t_r / 60)&#xA;        t_r = t_r - (mins * 60)&#xA;    secs = t_r&#xA;    hrsf = str(hrs).zfill(2)&#xA;    minsf = str(mins).zfill(2)&#xA;    secsf = str(secs).zfill(2)&#xA;    t_fnl = hrsf &#x2B; &#x27;:&#x27; &#x2B; minsf &#x2B; &#x27;:&#x27; &#x2B; secsf&#xA;    return t_fnl&#xA;&#xA;def go_main():&#xA;    tf = TF()&#xA;    vid_n = 0&#xA;    arglen = len(sys.argv)&#xA;    if arglen == 2:&#xA;        with open(sys.argv[1], &#x27;r&#x27;) as f_in:&#xA;            lines = f_in.readlines()&#xA;            start = None&#xA;            end = None&#xA;            cnt = 0&#xA;            for line in lines:&#xA;                if line[:5] == &#x27;BEGIN&#x27;:&#xA;                    start = cnt&#xA;                if line[:3] == &#x27;END&#x27;:&#xA;                    end = cnt&#xA;                cnt &#x2B;= 1&#xA;            if start == None or end == None:&#xA;                print(&#x27;Invalid file format. start = {}, end = {}&#x27;.format(start,end))&#xA;                return&#xA;            else:&#xA;                lines_r = lines[start&#x2B;1:end]&#xA;                del lines&#xA;                print(&#x27;videos to process: {}&#x27;.format(len(lines_r)))&#xA;                f_out_prefix = ""&#xA;                for vid in lines_r:&#xA;                     vid_n &#x2B;= 1&#xA;                    print(&#x27;\nProcessing video {}/{}&#x27;.format(vid_n, len(lines_r)))&#xA;                    f_out_prefix = &#x27;v&#x27; &#x2B; str(vid_n) &#x2B; &#x27;-&#x27;&#xA;                    dat = vid.split(&#x27;!&#x27;)[1:3]&#xA;                    title = dat[0]&#xA;                    dat_t = dat[1].split(&#x27;,&#x27;)&#xA;                    v_pieces = len(dat_t)&#xA;                    piece_n = 0&#xA;                    video_pieces = []&#xA;                    cmd1 = "echo -n \"\" > tmpfile"&#xA;                    subprocess.run(cmd1, shell=True)                    &#xA;                    print(&#x27;  new tmpfile created&#x27;)&#xA;                    for v_times in dat_t:&#xA;                        piece_n &#x2B;= 1&#xA;                        f_out = f_out_prefix &#x2B; str(piece_n) &#x2B; &#x27;.mp4&#x27;&#xA;                        video_pieces.append(f_out)&#xA;                        print(&#x27;  piece filename {} added to video_pieces list&#x27;.format(f_out))&#xA;                        v_times_spl = v_times.split(&#x27;-&#x27;)&#xA;                        v_times_start = v_times_spl[0]&#xA;                        v_times_end = v_times_spl[1]&#xA;                        t_st = tf.toLong(v_times_start)&#xA;                        t_dur = tf.toTime(tf.toSeconds(v_times_end) - tf.toSeconds(v_times_start))&#xA;                        cmd3 = ["ffmpeg", "-i", title, "-ss", t_st, "-t", t_dur, f_out, "-loglevel", "error", "-stats"]&#xA;                        print(&#x27;  cutting out piece {}/{} - {}&#x27;.format(piece_n, len(dat_t), t_dur))&#xA;                        subprocess.run(cmd3)&#xA;                    for video_piece_name in video_pieces:&#xA;                        cmd4 = "echo \"file " &#x2B; video_piece_name &#x2B; "\" >> tmpfile"&#xA;                        subprocess.run(cmd4, shell=True)&#xA;                        print(&#x27;  filename {} added to tmpfile&#x27;.format(video_piece_name))&#xA;                    vname = f_out_prefix[:-1] &#x2B; ".mp4"&#xA;                    print(&#x27;  name of joined file: {}&#x27;.format(vname))&#xA;                    cmd5 = "ffmpeg -f concat -safe 0 -i tmpfile -c copy joined.mp4 -loglevel error -stats"&#xA;                    to_be_joined = " ".join(video_pieces)&#xA;                    print(&#x27;  joining...&#x27;)&#xA;                    join_cmd = subprocess.Popen(cmd5, shell=True)&#xA;                    join_cmd.wait()&#xA;                    print(&#x27;  joined!&#x27;)&#xA;                    cmd6 = "mv joined.mp4 " &#x2B; vname&#xA;                    rename_cmd = subprocess.Popen(cmd6, shell=True)&#xA;                    rename_cmd.wait()&#xA;                    print(&#x27;  File joined.mp4 renamed to {}&#x27;.format(vname))&#xA;                    cmd7 = "rm " &#x2B; to_be_joined&#xA;                    rm_cmd = subprocess.Popen(cmd7, shell=True)&#xA;                    rm_cmd.wait()&#xA;                    print(&#x27;rm command completed - pieces removed&#x27;)&#xA;                cmd8 = "rm tmpfile"&#xA;                subprocess.run(cmd8, shell=True)&#xA;                print(&#x27;tmpfile removed&#x27;)&#xA;                print(&#x27;All done&#x27;)&#xA;    else:&#xA;        print(&#x27;Incorrect number of arguments&#x27;)&#xA;&#xA;############################&#xA;if __name__ == &#x27;__main__&#x27;:&#xA;    go_main()&#xA;

    &#xA;

    process_videos.py is called from bash terminal like this :

    &#xA;

    $ python process_videos.py video_data   &#xA;

    &#xA;

    video_data file has the following format :

    &#xA;

    BEGIN&#xA;!first_video.mp4!3-23,55-1:34,2:01-3:15,3:34-3:44!&#xA;!second_video.mp4!2-7,12-44,1:03-1:33!&#xA;END&#xA;

    &#xA;

    My system details :

    &#xA;

    System:    Host: snowflake Kernel: 5.4.0-52-generic x86_64 bits: 64 Desktop: Gnome 3.28.4&#xA;           Distro: Ubuntu 18.04.5 LTS&#xA;Machine:   Device: desktop System: Gigabyte product: N/A serial: N/A&#xA;Mobo:      Gigabyte model: Z77-D3H v: x.x serial: N/A BIOS: American Megatrends v: F14 date: 05/31/2012&#xA;CPU:       Quad core Intel Core i5-3570 (-MCP-) cache: 6144 KB &#xA;           clock speeds: max: 3800 MHz 1: 1601 MHz 2: 1601 MHz 3: 1601 MHz 4: 1602 MHz&#xA;Drives:    HDD Total Size: 1060.2GB (55.2% used)&#xA;           ID-1: /dev/sda model: ST31000524AS size: 1000.2GB&#xA;           ID-2: /dev/sdb model: Corsair_Force_GT size: 60.0GB&#xA;Partition: ID-1: / size: 366G used: 282G (82%) fs: ext4 dev: /dev/sda1&#xA;           ID-2: swap-1 size: 0.70GB used: 0.00GB (0%) fs: swap dev: /dev/sda5&#xA;Info:      Processes: 313 Uptime: 16:37 Memory: 3421.4/15906.9MB Client: Shell (bash) inxi: 2.3.56&#xA;

    &#xA;