Recherche avancée

Médias (3)

Mot : - Tags -/spip

Autres articles (38)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

  • Support audio et vidéo HTML5

    10 avril 2011

    MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
    Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
    Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
    Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...)

Sur d’autres sites (8406)

  • current version of ffmpeg3.3.2 encode twice time of my video,the duration last two times long

    20 juin 2017, par jimmy

    I have a video with 00:01:41.46 play time,and transcode it perfect with ffmpeg-2.1.1,but when I upgrade FFmpeg version to 3.3.2 and compile it with the same compile option and same transcode option as 2.1.1 version used, I got a video with 00:03:21.82 long, I played that video to see what was added after 1:41.46, and find that it just repeat the video from the beginning with no audio, I find out no idea to this issue, it seems to be a bug that FFmpeg introducing, anyone help me !

    here is the log that I had transcoded with ffmpeg 3.3.2 :

    ffmpeg -i natural.mp4 -c:v libx264 -c:a copy output.mp4
    ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 4.6 (Ubuntu/Linaro 4.6.4-6ubuntu2)

    configuration: --enable-gpl --enable-nonfree --yasmexe=release/bin/yasm -- prefix=release --cc= --enable-static --disable-shared --disable-debug --extra-cflags=-Irelease/include --extra-ldflags='-Lrelease/lib -lm -ldl' --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --enable-postproc --enable-bzlib --enable-zlib --enable-parsers --enable-libx264 --enable-libmp3lame --enable-libfdk-aac --enable-libspeex --enable-pthreads --extra->libs=-lpthread --enable-encoders --enable-decoders --enable-avfilter --enable->muxers --enable-demuxers

    libavutil      55. 58.100 / 55. 58.100
    libavcodec     57. 89.100 / 57. 89.100
    libavformat    57. 71.100 / 57. 71.100
    libavdevice    57.  6.100 / 57.  6.100
    libavfilter     6. 82.100 /  6. 82.100
    libswscale      4.  6.100 /  4.  6.100
    libswresample   2.  7.100 /  2.  7.100
    libpostproc    54.  5.100 / 54.  5.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'natural.mp4':
     Metadata:
     major_brand     : mp42
     minor_version   : 0
     compatible_brands: mp42isom
     creation_time   : 2009-07-11T08:32:34.000000Z
     encoder         : mp4creator 1.6.1d
     Duration: 00:01:41.46, start: 0.000000, bitrate: 9063 kb/s
     Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 8976 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 2997 tbc (default)
    Metadata:
       creation_time   : 2009-07-11T08:32:34.000000Z
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
       creation_time   : 2009-07-11T08:33:09.000000Z
    Stream mapping:
     Stream #0:0 -> #0:0 (mpeg4 (native) -> h264 (libx264))
     Stream #0:1 -> #0:1 (copy)
    Press [q] to stop, [?] for help
    [libx264 @ 0x2d951e0] using SAR=4/3
    [libx264 @ 0x2d951e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX AVX2 FMA3 LZCNT BMI2
    [libx264 @ 0x2d951e0] profile High, level 4.0
    [libx264 @ 0x2d951e0] 264 - core 138 r1+3473M a37a143 - H.264/MPEG-4 AVC codec >- Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 >ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 >mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 >fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 >nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 >b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 >keyint=250 keyint_min=23 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf >mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to 'output.mp4':
    Metadata:
     major_brand     : mp42
     minor_version   : 0
     compatible_brands: mp42isom
     encoder         : Lavf57.71.100
    Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
     Metadata:
       creation_time   : 2009-07-11T08:32:34.000000Z
       encoder         : Lavc57.89.100 libx264
     Side data:
       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
     Stream #0:1(eng): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 125 kb/s (default)
     Metadata:
       creation_time   : 2009-07-11T08:33:09.000000Z
    frame= 4842 fps= 27 q=-1.0 Lsize=  107608kB time=00:03:21.82
    bitrate=4367.8kbits/s speed=1.11x    
       video:105973kB audio:1556kB subtitle:0kB other streams:0kB global headers:0kB >muxing overhead: 0.074199%
    [libx264 @ 0x2d951e0] frame I:54    Avg QP:19.81  size: 77248
    [libx264 @ 0x2d951e0] frame P:3960  Avg QP:22.01  size: 25371
    [libx264 @ 0x2d951e0] frame B:828   Avg QP:23.01  size:  4680
    [libx264 @ 0x2d951e0] consecutive B-frames: 75.2%  4.6%  4.3% 15.9%
    [libx264 @ 0x2d951e0] mb I  I16..4: 17.0% 79.0%  3.9%
    [libx264 @ 0x2d951e0] mb P  I16..4:  2.1%  7.8%  0.2%  P16..4: 43.9%  9.7% 6.4%  0.0%  0.0%    skip:29.9%
    [libx264 @ 0x2d951e0] mb B  I16..4:  0.2%  1.1%  0.0%  B16..8: 29.2%  1.2%  0.2%  direct: 0.7%  skip:67.3%  L0:49.0% L1:47.7% BI: 3.3%
    [libx264 @ 0x2d951e0] 8x8 transform intra:78.1% inter:81.6%
    [libx264 @ 0x2d951e0] coded y,uvDC,uvAC intra: 52.3% 66.4% 11.9% inter: 20.5% >24.2% 0.8%
    [libx264 @ 0x2d951e0] i16 v,h,dc,p: 32% 22% 28% 18%
    [libx264 @ 0x2d951e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 19% 43%  3%  3%  3%  5%  2%  4%
    [libx264 @ 0x2d951e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 24% 12%  4%  8%  7% 11%  4%  5%
    [libx264 @ 0x2d951e0] i8c dc,h,v,p: 50% 23% 23%  4%
    [libx264 @ 0x2d951e0] Weighted P-Frames: Y:1.5% UV:0.3%
    [libx264 @ 0x2d951e0] ref P L0: 71.9% 17.0%  8.5%  2.5%  0.0%
    [libx264 @ 0x2d951e0] ref B L0: 89.7%  9.2%  1.2%
    [libx264 @ 0x2d951e0] ref B L1: 97.5%  2.5%
    [libx264 @ 0x2d951e0] kb/s:4298.67

    Here is the output when use ffmpeg -i natural.mp4 -c copy out.mp4,the output still last double times long :

    ./ffmpeg -i natural.mp4 -c copy out.mp4
    ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
    built with gcc 4.6 (Ubuntu/Linaro 4.6.4-6ubuntu2)
     configuration: --enable-gpl --enable-nonfree --yasmexe=release/bin/yasm --prefix=release --cc= --enable-static --disable-shared --disable-debug --extra-cflags=-Irelease/include --extra-ldflags='-Lrelease/lib -lm -ldl' --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --enable-postproc --enable-bzlib --enable-zlib --enable-parsers --enable-libx264 --enable-libmp3lame --enable-libfdk-aac --enable-libspeex --enable-pthreads --extra-libs=-lpthread --enable-encoders --enable-decoders --enable-avfilter --enable-muxers --enable-demuxers
     libavutil      55. 58.100 / 55. 58.100
     libavcodec     57. 89.100 / 57. 89.100
     libavformat    57. 71.100 / 57. 71.100
     libavdevice    57.  6.100 / 57.  6.100
     libavfilter     6. 82.100 /  6. 82.100
     libswscale      4.  6.100 /  4.  6.100
     libswresample   2.  7.100 /  2.  7.100
     libpostproc    54.  5.100 / 54.  5.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'natural.mp4':
     Metadata:
       major_brand     : mp42
       minor_version   : 0
       compatible_brands: mp42isom
       creation_time   : 2009-07-11T08:32:34.000000Z
       encoder         : mp4creator 1.6.1d
     Duration: 00:01:41.46, start: 0.000000, bitrate: 9063 kb/s
       Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 8976 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 2997 tbc (default)
       Metadata:
         creation_time   : 2009-07-11T08:32:34.000000Z
       Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
       Metadata:
         creation_time   : 2009-07-11T08:33:09.000000Z
    Output #0, mp4, to 'out.mp4':
     Metadata:
       major_brand     : mp42
       minor_version   : 0
       compatible_brands: mp42isom
       encoder         : Lavf57.71.100
       Stream #0:0(eng): Video: mpeg4 (Simple Profile) ( [0][0][0] / 0x0020), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], q=2-31, 8976 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 90k tbc (default)
       Metadata:
         creation_time   : 2009-07-11T08:32:34.000000Z
       Stream #0:1(eng): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 125 kb/s (default)
       Metadata:
         creation_time   : 2009-07-11T08:33:09.000000Z
    Stream mapping:
     Stream #0:0 -> #0:0 (copy)
     Stream #0:1 -> #0:1 (copy)
    Press [q] to stop, [?] for help
    frame= 4842 fps=2243 q=-1.0 Lsize=  222944kB time=00:03:21.91
    bitrate=9045.4kbits/s speed=93.5x    
    video:221299kB audio:1556kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.039627%

    Here is the output what ffmpeg-2.1.1 generate,It’s executed correctly :

    ./ffmpeg -i natural.mp4 -c copy output2.mp4
    ffmpeg version 2.1.1 Copyright (c) 2000-2013 the FFmpeg developers
     built on Mar 10 2017 13:56:14 with gcc 4.6 (Ubuntu/Linaro 4.6.4-6ubuntu2)
     configuration: --enable-gpl --enable-nonfree --yasmexe=release/bin/yasm --prefix=release --cc= --enable-static --disable-shared --disable-debug --extra-cflags='-I${ffmpeg_exported_release_dir}/include' --extra-ldflags='-L${ffmpeg_exported_release_dir}/lib -lm -ldl' --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --enable-postproc --enable-bzlib --enable-zlib --enable-parsers --enable-libx264 --enable-libmp3lame --enable-libfdk-aac --enable-libspeex --enable-pthreads --extra-libs=-lpthread --enable-encoders --enable-decoders --enable-avfilter --enable-muxers --enable-demuxers
     libavutil      52. 48.101 / 52. 48.101
     libavcodec     55. 39.101 / 55. 39.101
     libavformat    55. 19.104 / 55. 19.104
     libavdevice    55.  5.100 / 55.  5.100
     libavfilter     3. 90.100 /  3. 90.100
     libswscale      2.  5.101 /  2.  5.101
     libswresample   0. 17.104 /  0. 17.104
     libpostproc    52.  3.100 / 52.  3.100
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x2d2e900] multiple edit list entries, a/v desync might occur, patch welcome
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'natural.mp4':
     Metadata:
       major_brand     : mp42
       minor_version   : 0
       compatible_brands: mp42isom
       creation_time   : 2009-07-11 08:32:34
       encoder         : mp4creator 1.6.1d
     Duration: 00:01:41.46, start: 0.000000, bitrate: 9063 kb/s
       Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 8976 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 2997 tbc (default)
       Metadata:
         creation_time   : 2009-07-11 08:32:34
       Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
       Metadata:
         creation_time   : 2009-07-11 08:33:09
    Output #0, mp4, to 'output2.mp4':
     Metadata:
       major_brand     : mp42
       minor_version   : 0
       compatible_brands: mp42isom
       encoder         : Lavf55.19.104
       Stream #0:0(eng): Video: mpeg4 ( [0][0][0] / 0x0020), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], q=2-31, 8976 kb/s, 23.98 fps, 90k tbn, 90k tbc (default)
       Metadata:
         creation_time   : 2009-07-11 08:32:34
       Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 125 kb/s (default)
       Metadata:
         creation_time   : 2009-07-11 08:33:09
    Stream mapping:
     Stream #0:0 -> #0:0 (copy)
     Stream #0:1 -> #0:1 (copy)
    Press [q] to stop, [?] for help
    frame= 2421 fps=0.0 q=-1.0 Lsize=  112273kB time=00:01:41.49 bitrate=9062.0kbits/s    
    video:110650kB audio:1556kB subtitle:0 global headers:0kB muxing overhead 0.060302%

    Here is the video link

  • Rails using stremio-ffmpeg gem to watermark a movie while uploading

    16 juin 2016, par Felix

    I am using carrierwave to upload a movie to amazon s3 that works perfect.

    Now I want to add a watermark to the movie while uploading or after uploading, I don’t know, what’s the best way ?

    I tried this :

    movie_controller.rb action uploadVideo

    movie = FFMPEG::Movie.new(@vid.video.url)

    puts "........................................"
    puts movie.inspect

    if @vid.save

    Just to find out if the video is catched from stremio.

    But then I got the error that the movie is not found, the problem is that it doesn’t look in the amazon s3 bucket, it looks on my local server

    No such file or directory - the file '/uploads/tmp/1462954331-3471-8766/VID-20160424-WA0013.mp4' does not exist

    What could be the solution ? or should I do this in carrierwave uploader ?

    UPDATE :

    When I do this after the .save action it looks at amazon s3 bucket .. but also says that the movie isn’t there. But if I call it directly in browser it’s displayed.

    UPDATE Code :

    #Laedt ein Video hoch
    def uploadMovie
     @user = User.find_by_id session[:user_id]
     #Holt alle Channels für die er eine Berechtigung hat (Eingeloggter user)
     @user = User.find_by_id session[:user_id]
     @knowledgeproviderList = @user.knowledgeprovider
     @channels = Channel.where(knowledgeprovider_id:     @knowledgeproviderList.pluck(:id))
     @vid = Movie.new(movies_params)
     @channel = Channel.find(params[:vid][:channel_id])
     @vid.channel = @channel

     #Fügt dem Movie einen Tag hinzu
     createTag params
     createCategory params



     if @vid.save
       flash[:notice] = t("flash.saved")

       #movie = FFMPEG::Movie.new(@vid.video.url)

       #puts "........................................"
       #puts movie.inspect

       redirect_to :action => :add
      else
        redirect_to :action => :add
     end
    end

    Update error :

    movie = FFMPEG::Movie.new(@vid.video.current_path)

    options = {watermark: "mages/header.png", resolution: "640x360", watermark_filter: { position: "RT", padding_x: 10, padding_y: 10 } }
    movie.transcode("movie.flv", options)

    enter image description here

    Update :
    Added the code in the uploader :

     process :watermark_movie

        def watermark_movie
          if self.file.path
                options = {watermark: "images/header.png", resolution: "640x360", watermark_filter: { position: "RT", padding_x: 10, padding_y: 10 } }
                self.model.file = FFMPEG::Movie.new(self.file.path).transcode("#{root}/#{cache_dir}/#{self.cache_id}/file.mp4", options)
           end
         end

    Error :

    multi_json (1.12.0) lib/multi_json/adapter.rb:19:in `load'
    multi_json (1.12.0) lib/multi_json.rb:122:in `load'
    streamio-ffmpeg (2.0.0) lib/ffmpeg/movie.rb:28:in `initialize'
    app/uploaders/movie_uploader.rb:40:in `new'
    app/uploaders/movie_uploader.rb:40:in `watermark_movie'
    carrierwave (0.11.2) lib/carrierwave/uploader/processing.rb:84:in `block in process!'
    carrierwave (0.11.2) lib/carrierwave/uploader/processing.rb:76:in `each'
    carrierwave (0.11.2) lib/carrierwave/uploader/processing.rb:76:in `process!'
    carrierwave_backgrounder (0.4.2) lib/backgrounder/delay.rb:14:in `process!'
    carrierwave (0.11.2) lib/carrierwave/uploader/callbacks.rb:18:in `block in with_callbacks'
    carrierwave (0.11.2) lib/carrierwave/uploader/callbacks.rb:18:in `each'
    carrierwave (0.11.2) lib/carrierwave/uploader/callbacks.rb:18:in `with_callbacks'
    carrierwave (0.11.2) lib/carrierwave/uploader/cache.rb:134:in `cache!'
    carrierwave (0.11.2) lib/carrierwave/mount.rb:329:in `cache'
    carrierwave (0.11.2) lib/carrierwave/mount.rb:163:in `video='
    carrierwave (0.11.2) lib/carrierwave/orm/activerecord.rb:39:in `video='
    activerecord (4.2.1) lib/active_record/attribute_assignment.rb:54:in `public_send'
    activerecord (4.2.1) lib/active_record/attribute_assignment.rb:54:in `_assign_attribute'
    activerecord (4.2.1) lib/active_record/attribute_assignment.rb:41:in `block in assign_attributes'
    actionpack (4.2.1) lib/action_controller/metal/strong_parameters.rb:183:in `each_pair'
    actionpack (4.2.1) lib/action_controller/metal/strong_parameters.rb:183:in `each_pair'
    activerecord (4.2.1) lib/active_record/attribute_assignment.rb:35:in `assign_attributes'
    activerecord (4.2.1) lib/active_record/core.rb:559:in `init_attributes'
    activerecord (4.2.1) lib/active_record/core.rb:281:in `initialize'
    activerecord (4.2.1) lib/active_record/inheritance.rb:61:in `new'
    activerecord (4.2.1) lib/active_record/inheritance.rb:61:in `new'
    app/controllers/movies_controller.rb:71:in `uploadMovie'
    actionpack (4.2.1) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
    actionpack (4.2.1) lib/abstract_controller/base.rb:198:in `process_action'
    actionpack (4.2.1) lib/action_controller/metal/rendering.rb:10:in `process_action'
    actionpack (4.2.1) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
    activesupport (4.2.1) lib/active_support/callbacks.rb:117:in `call'
    activesupport (4.2.1) lib/active_support/callbacks.rb:117:in `call'
    activesupport (4.2.1) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
    activesupport (4.2.1) lib/active_support/callbacks.rb:505:in `call'
    activesupport (4.2.1) lib/active_support/callbacks.rb:505:in `call'
    activesupport (4.2.1) lib/active_support/callbacks.rb:92:in `_run_callbacks'
    activesupport (4.2.1) lib/active_support/callbacks.rb:776:in `_run_process_action_callbacks'
    activesupport (4.2.1) lib/active_support/callbacks.rb:81:in `run_callbacks'
    actionpack (4.2.1) lib/abstract_controller/callbacks.rb:19:in `process_action'
    actionpack (4.2.1) lib/action_controller/metal/rescue.rb:29:in `process_action'
    actionpack (4.2.1) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
    activesupport (4.2.1) lib/active_support/notifications.rb:164:in `block in instrument'
    activesupport (4.2.1) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    activesupport (4.2.1) lib/active_support/notifications.rb:164:in `instrument'
    actionpack (4.2.1) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
    actionpack (4.2.1) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
    activerecord (4.2.1) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
    actionpack (4.2.1) lib/abstract_controller/base.rb:137:in `process'
    actionview (4.2.1) lib/action_view/rendering.rb:30:in `process'
    actionpack (4.2.1) lib/action_controller/metal.rb:196:in `dispatch'
    actionpack (4.2.1) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
    actionpack (4.2.1) lib/action_controller/metal.rb:237:in `block in action'
    actionpack (4.2.1) lib/action_dispatch/routing/route_set.rb:74:in `call'
    actionpack (4.2.1) lib/action_dispatch/routing/route_set.rb:74:in `dispatch'
    actionpack (4.2.1) lib/action_dispatch/routing/route_set.rb:43:in `serve'
    actionpack (4.2.1) lib/action_dispatch/journey/router.rb:43:in `block in serve'
    actionpack (4.2.1) lib/action_dispatch/journey/router.rb:30:in `each'
    actionpack (4.2.1) lib/action_dispatch/journey/router.rb:30:in `serve'
    actionpack (4.2.1) lib/action_dispatch/routing/route_set.rb:819:in `call'
    rack (1.6.4) lib/rack/etag.rb:24:in `call'
    rack (1.6.4) lib/rack/conditionalget.rb:38:in `call'
    rack (1.6.4) lib/rack/head.rb:13:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/flash.rb:260:in `call'
    rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context'
    rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/cookies.rb:560:in `call'
    activerecord (4.2.1) lib/active_record/query_cache.rb:36:in `call'
    activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:649:in `call'
    activerecord (4.2.1) lib/active_record/migration.rb:378:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
    activesupport (4.2.1) lib/active_support/callbacks.rb:88:in `call'
    activesupport (4.2.1) lib/active_support/callbacks.rb:88:in `_run_callbacks'
    activesupport (4.2.1) lib/active_support/callbacks.rb:776:in `_run_call_callbacks'
    activesupport (4.2.1) lib/active_support/callbacks.rb:81:in `run_callbacks'
    actionpack (4.2.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/reloader.rb:73:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
    web-console (2.3.0) lib/web_console/middleware.rb:20:in `block in call'
    web-console (2.3.0) lib/web_console/middleware.rb:18:in `catch'
    web-console (2.3.0) lib/web_console/middleware.rb:18:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
    railties (4.2.1) lib/rails/rack/logger.rb:38:in `call_app'
    railties (4.2.1) lib/rails/rack/logger.rb:20:in `block in call'
    activesupport (4.2.1) lib/active_support/tagged_logging.rb:68:in `block in tagged'
    activesupport (4.2.1) lib/active_support/tagged_logging.rb:26:in `tagged'
    activesupport (4.2.1) lib/active_support/tagged_logging.rb:68:in `tagged'
    railties (4.2.1) lib/rails/rack/logger.rb:20:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
    rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
    rack (1.6.4) lib/rack/runtime.rb:18:in `call'
    activesupport (4.2.1) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
    rack (1.6.4) lib/rack/lock.rb:17:in `call'
    actionpack (4.2.1) lib/action_dispatch/middleware/static.rb:113:in `call'
    rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
    railties (4.2.1) lib/rails/engine.rb:518:in `call'
    railties (4.2.1) lib/rails/application.rb:164:in `call'
    rack (1.6.4) lib/rack/lock.rb:17:in `call'
    rack (1.6.4) lib/rack/content_length.rb:15:in `call'
    rack (1.6.4) lib/rack/handler/webrick.rb:88:in `service'
    /home/felix/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
    /home/felix/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
    /home/felix/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'

    UPDATE — Movie Uploader

    # encoding: utf-8
    class MovieUploader < CarrierWave::Uploader::Base

     # Include RMagick or MiniMagick support:
     # include CarrierWave::RMagick
     include CarrierWave::MiniMagick
     include CarrierWave::Video
     include CarrierWave::Video::Thumbnailer
     include CarrierWave::Backgrounder::Delay

     require 'rubygems'
     require 'streamio-ffmpeg'

     # Choose what kind of storage to use for this uploader:
     storage :fog

     # Override the directory where uploaded files will be stored.
     # This is a sensible default for uploaders that are meant to be mounted:
     def store_dir
       "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
     end

     process :watermark_movie

     def watermark_movie
       puts "ssssssssssssssssssssssssssssssssss"
       puts self.file.inspect

       if self.file.path
         options = {watermark: "http://felix-hohlwegler.de/holz-soft/include/designs/design13/images/header.png", resolution: "640x360", watermark_filter: { position: "RT", padding_x: 10, padding_y: 10 } }
         self.model.file = FFMPEG::Movie.new(self.file.path).transcode("#{root}/#{cache_dir}/#{self.cache_id}/file.mp4", options)
       end
     end

     version :thumb do
       process thumbnail: [{format: 'png', quality: 10, size: 1200, strip: false, seek: 10, logger: Rails.logger}]
       def full_filename for_file
         png_name for_file, version_name
       end
     end

     def png_name for_file, version_name
       %Q{#{version_name}_#{for_file.chomp(File.extname(for_file))}.png}
     end


     # Add a white list of extensions which are allowed to be uploaded.
     # For images you might use something like this:
      def extension_white_list
        %w(mov avi mkv mpeg mpeg2 mp4 3gp)
      end
    end
  • Heroic Defender of the Stack

    27 janvier 2011, par Multimedia Mike — Programming

    Problem Statement

    I have been investigating stack smashing and countermeasures (stack smashing prevention, or SSP). Briefly, stack smashing occurs when a function allocates a static array on the stack and writes past the end of it, onto other local variables and eventually onto other function stack frames. When it comes time to return from the function, the return address has been corrupted and the program ends up some place it really shouldn’t. In the best case, the program just crashes ; in the worst case, a malicious party crafts code to exploit this malfunction.

    Further, debugging such a problem is especially obnoxious because by the time the program has crashed, it has already trashed any record (on the stack) of how it got into the errant state.

    Preventative Countermeasure

    GCC has had SSP since version 4.1. The computer inserts SSP as additional code when the -fstack-protector command line switch is specified. Implementation-wise, SSP basically inserts a special value (the literature refers to this as the ’canary’ as in "canary in the coalmine") at the top of the stack frame when entering the function, and code before leaving the function to make sure the canary didn’t get stepped on. If something happens to the canary, the program is immediately aborted with a message to stderr about what happened. Further, gcc’s man page on my Ubuntu machine proudly trumpets that this functionality is enabled per default ever since Ubuntu 6.10.

    And that’s really all there is to it. Your code is safe from stack smashing by default. Or so the hand-wavy documentation would have you believe.

    Not exactly

    Exercising the SSP

    I wanted to see the SSP in action to make sure it was a real thing. So I wrote some code that smashes the stack in pretty brazen ways so that I could reasonably expect to trigger the SSP (see later in this post for the code). Here’s what I learned that wasn’t in any documentation :

    SSP is only emitted for functions that have static arrays of 8-bit data (i.e., [unsigned] chars). If you have static arrays of other data types (like, say, 32-bit ints), those are still fair game for stack smashing.

    Evaluating the security vs. speed/code size trade-offs, it makes sense that the compiler wouldn’t apply this protection everywhere (I can only muse about how my optimization-obsessive multimedia hacking colleagues would absolute freak out if this code were unilaterally added to all functions). So why are only static char arrays deemed to be "vulnerable objects" (the wording that the gcc man page uses) ? A security hacking colleague suggested that this is probably due to the fact that the kind of data which poses the highest risk is arrays of 8-bit input data from, e.g., network sources.

    The gcc man page also lists an option -fstack-protector-all that is supposed to protect all functions. The man page’s definition of "all functions" perhaps differs from my own since invoking the option does not have differ in result from plain, vanilla -fstack-protector.

    The Valgrind Connection

    "Memory trouble ? Run Valgrind !" That may as well be Valgrind’s marketing slogan. Indeed, it’s the go-to utility for finding troublesome memory-related problems and has saved me on a number of occasions. However, it must be noted that it is useless for debugging this type of problem. If you understand how Valgrind works, this makes perfect sense. Valgrind operates by watching all memory accesses and ensuring that the program is only accessing memory to which it has privileges. In the stack smashing scenario, the program is fully allowed to write to that stack space ; after all, the program recently, legitimately pushed that return value onto the stack when calling the errant, stack smashing function.

    Valgrind embodies a suite of tools. My idea for an addition to this suite would be a mechanism which tracks return values every time a call instruction is encountered. The tool could track the return values in a separate stack data structure, though this might have some thorny consequences for some more unusual program flows. Instead, it might track them in some kind of hash/dictionary data structure and warn the programmer whenever a ’ret’ instruction is returning to an address that isn’t in the dictionary.

    Simple Stack Smashing Code

    Here’s the code I wrote to test exactly how SSP gets invoked in gcc. Compile with ’gcc -g -O0 -Wall -fstack-protector-all -Wstack-protector stack-fun.c -o stack-fun’.

    stack-fun.c :

    C :
    1. /* keep outside of the stack frame */
    2. static int i ;
    3.  
    4. void stack_smasher32(void)
    5. {
    6.  int buffer32[8] ;
    7.  // uncomment this array and compile without optimizations
    8.  // in order to force this function to compile with SSP
    9. // char buffer_to_trigger_ssp[8] ;
    10.  
    11.  for (i = 0 ; i <50 ; i++)
    12.   buffer32[i] = 0xA5 ;
    13. }
    14.  
    15. void stack_smasher8(void)
    16. {
    17.  char buffer8[8] ;
    18.  for (i = 0 ; i <50 ; i++)
    19.   buffer8[i] = 0xA5 ;
    20. }
    21.  
    22. int main()
    23. {
    24. // stack_smasher8() ;
    25.  stack_smasher32() ;
    26.  return 0 ;
    27. }

    The above incarnation should just produce the traditional "Segmentation fault". However, uncommenting and executing stack_smasher8() in favor of stack_smasher32() should result in "*** stack smashing detected *** : ./stack-fun terminated", followed by the venerable "Segmentation fault".

    As indicated in the comments for stack_smasher32(), it’s possible to trick the compiler into emitting SSP for a function by inserting an array of at least 8 bytes (any less and SSP won’t emit, as documented, unless gcc’s ssp-buffer-size parameter is tweaked). This has to be compiled with no optimization at all (-O0) or else the compiler will (quite justifiably) optimize away the unused buffer and omit SSP.

    For reference, I ran my tests on Ubuntu 10.04.1 with gcc 4.4.3 compiling the code for both x86_32 and x86_64.