Recherche avancée

Médias (91)

Autres articles (53)

  • Installation en mode ferme

    4 février 2011, par

    Le mode ferme permet d’héberger plusieurs sites de type MediaSPIP en n’installant qu’une seule fois son noyau fonctionnel.
    C’est la méthode que nous utilisons sur cette même plateforme.
    L’utilisation en mode ferme nécessite de connaïtre un peu le mécanisme de SPIP contrairement à la version standalone qui ne nécessite pas réellement de connaissances spécifique puisque l’espace privé habituel de SPIP n’est plus utilisé.
    Dans un premier temps, vous devez avoir installé les mêmes fichiers que l’installation (...)

  • Keeping control of your media in your hands

    13 avril 2011, par

    The vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
    While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
    MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
    MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...)

  • Configuration spécifique d’Apache

    4 février 2011, par

    Modules spécifiques
    Pour la configuration d’Apache, il est conseillé d’activer certains modules non spécifiques à MediaSPIP, mais permettant d’améliorer les performances : mod_deflate et mod_headers pour compresser automatiquement via Apache les pages. Cf ce tutoriel ; mode_expires pour gérer correctement l’expiration des hits. Cf ce tutoriel ;
    Il est également conseillé d’ajouter la prise en charge par apache du mime-type pour les fichiers WebM comme indiqué dans ce tutoriel.
    Création d’un (...)

Sur d’autres sites (10980)

  • FFMPEG RTSP stream to MPEG4/H264 file using libx264

    4 décembre 2016, par Phi

    Heyo folks,

    I’m attempting to transcode/remux an RTSP stream in H264 format into a MPEG4 container, containing just the H264 video stream. Basically, webcam output into a MP4 container.

    I can get a poorly coded MP4 produced, using this code :

    // Variables here for demo
    AVFormatContext * video_file_output_format = nullptr;
    AVFormatContext * rtsp_format_context = nullptr;
    AVCodecContext * video_file_codec_context = nullptr;
    AVCodecContext * rtsp_vidstream_codec_context = nullptr;
    AVPacket packet = {0};
    AVStream * video_file_stream = nullptr;
    AVCodec * rtsp_decoder_codec = nullptr;
    int errorNum = 0, video_stream_index = 0;
    std::string outputMP4file = "D:\\somemp4file.mp4";

    // begin
    AVDictionary * opts = nullptr;
    av_dict_set(&opts, "rtsp_transport", "tcp", 0);

    if ((errorNum = avformat_open_input(&rtsp_format_context, uriANSI.c_str(), NULL, &opts)) < 0) {
       errOut << "Connection failed: avformat_open_input failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum);
       TacticalAbort();
       return;
    }

    rtsp_format_context->max_analyze_duration = 50000;
    if ((errorNum = avformat_find_stream_info(rtsp_format_context, NULL)) < 0) {
       errOut << "Connection failed: avformat_find_stream_info failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum);
       TacticalAbort();
       return;
    }

    video_stream_index = errorNum = av_find_best_stream(rtsp_format_context, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);

    if (video_stream_index < 0) {
       errOut << "Connection in unexpected state; made a connection, but there was no video stream.\r\n"
           "Attempts to find a video stream resulted in error " << errorNum << ": " << ErrorRead(errorNum);
       TacticalAbort();
       return;
    }

    rtsp_vidstream_codec_context = rtsp_format_context->streams[video_stream_index]->codec;

    av_init_packet(&packet);

    if (!(video_file_output_format = av_guess_format(NULL, outputMP4file.c_str(),  NULL))) {
       TacticalAbort();
       throw std::exception("av_guess_format");
    }

    if (!(rtsp_decoder_codec = avcodec_find_decoder(rtsp_vidstream_codec_context->codec_id))) {
       errOut << "Connection failed: connected, but avcodec_find_decoder returned null.\r\n"
           "Couldn't find codec with an AV_CODEC_ID value of " << rtsp_vidstream_codec_context->codec_id << ".";
       TacticalAbort();
       return;
    }

    video_file_format_context = avformat_alloc_context();
    video_file_format_context->oformat = video_file_output_format;

    if (strcpy_s(video_file_format_context->filename, sizeof(video_file_format_context->filename), outputMP4file.c_str())) {
       errOut << "Couldn't open video file: strcpy_s failed with error " << errno << ".";
       std::string log = errOut.str();
       TacticalAbort();
       throw std::exception("strcpy_s");
    }

    if (!(video_file_encoder_codec = avcodec_find_encoder(video_file_output_format->video_codec))) {
       TacticalAbort();
       throw std::exception("avcodec_find_encoder");
    }

    // MARKER ONE

    if (!outputMP4file.empty() &&
       !(video_file_output_format->flags & AVFMT_NOFILE) &&
       (errorNum = avio_open2(&video_file_format_context->pb, outputMP4file.c_str(), AVIO_FLAG_WRITE, nullptr, &opts)) < 0) {
       errOut << "Couldn't open video file \"" << outputMP4file << "\" for writing : avio_open2 failed with error " << errorNum << ": " << ErrorRead(errorNum);
       TacticalAbort();
       return;
    }

    // Create stream in MP4 file
    if (!(video_file_stream = avformat_new_stream(video_file_format_context, video_file_encoder_codec))) {
       TacticalAbort();
       return;
    }

    AVCodecContext * video_file_codec_context = video_file_stream->codec;

    // MARKER TWO

    // error -22/-21 in avio_open2 if this is skipped
    if ((errorNum = avcodec_copy_context(video_file_codec_context, rtsp_vidstream_codec_context)) != 0) {
       TacticalAbort();
       throw std::exception("avcodec_copy_context");
    }

    //video_file_codec_context->codec_tag = 0;

    /*
    // MARKER 3 - is this not needed? Examples suggest not.
    if ((errorNum = avcodec_open2(video_file_codec_context, video_file_encoder_codec, &opts)) < 0)
    {
       errOut << "Couldn't open video file codec context: avcodec_open2 failed with error " << errorNum << ": " << ErrorRead(errorNum);
       std::string log = errOut.str();
       TacticalAbort();
       throw std::exception("avcodec_open2, video file");
    }*/

    //video_file_format_context->flags |= AVFMT_FLAG_GENPTS;
    if (video_file_format_context->oformat->flags & AVFMT_GLOBALHEADER)
    {
       video_file_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
    }

    if ((errorNum = avformat_write_header(video_file_format_context, &opts)) < 0) {
       errOut << "Couldn't open video file: avformat_write_header failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum);
       std::string log = errOut.str();
       TacticalAbort();
       return;
    }

    However, there are several issues :

    1. I can’t pass any x264 options to the output file. The output H264 matches the input H264’s profile/level - switching cameras to a different model switches H264 level.
    2. The timing of the output file is off, noticeably.
    3. The duration of the output file is off, massively. A few seconds of footage becomes hours, although playtime doesn’t match. (FWIW, I’m using VLC to play them.)

    Passing x264 options

    If I manually increment PTS per packet, and set DTS equal to PTS, it plays too fast, 2-3 seconds’ worth of footage in one second playtime, and duration is hours long. The footage also blurs past several seconds, about 10 seconds’ footage in a second.

    If I let FFMPEG decide (with or without GENPTS flag), the file has a variable frame rate (probably as expected), but it plays the whole file in an instant and has a long duration too (over forty hours for a few seconds). The duration isn’t "real", as the file plays in an instant.

    At Marker One, I try to set the profile by passing options to avio_open2. The options are simply ignored by libx264. I’ve tried :

    av_dict_set(&opts, "vprofile", "main", 0);
    av_dict_set(&opts, "profile", "main", 0); // error, missing '('
    // FF_PROFILE_H264_MAIN equals 77, so I also tried
    av_dict_set(&opts, "vprofile", "77", 0);
    av_dict_set(&opts, "profile", "77", 0);

    It does seem to read the profile setting, but it doesn’t use them. At Marker Two, I tried to set it after the avio_open2, before avformat_write_header .

    // I tried all 4 av_dict_set from earlier, passing it to avformat_write_header.
    // None had any effect, they weren't consumed.
    av_opt_set(video_file_codec_context, "profile", "77", 0);
    av_opt_set(video_file_codec_context, "profile", "main", 0);
    video_file_codec_context->profile = FF_PROFILE_H264_MAIN;
    av_opt_set(video_file_codec_context->priv_data, "profile", "77", 0);
    av_opt_set(video_file_codec_context->priv_data, "profile", "main", 0);

    Messing with privdata made the program unstable, but I was trying anything at that point.
    I’d like to solve issue 1 with passing settings, since I imagine it’d bottleneck any attempt to solve issues 2 or 3.

    I’ve been fiddling with this for the better part of a month now. I’ve been through dozens of documentation, Q&As, examples. It doesn’t help that quite a few are outdated.

    Any help would be appreciated.

    Cheers

  • Ruby on Rails 4 Heroku App Crash while uploading large size video

    22 juillet 2016, par Krishna Vyas

    large video file isn’t uploading on heroku and throwing Application Crash error
    Here is my Model Code :

    has_attached_file :video, :styles => {
     :medium => {
       :geometry => "640x480",
       :format => 'mp4',
       :convert_options => {
       :output => {
         :vcodec => 'libx264',
         :acodec => 'copy'
       }
     }
     },
     :thumb => {
       :geometry => "300x300#",
       :format => 'jpg',
       :time => 2,
       :auto_rotate => true
     }
    }, :processors => [:transcoder]

    validates_attachment_content_type :video, content_type: /\Avideo\/.*\Z/

    Here is my log from heroku

    2016-07-22T13:15:13.616340+00:00 app[web.1]: Command :: file -b --mime '/tmp/33028ec79c8028f75908c90d9f018aeb20160722-3-1e90wvf.mp4'
    2016-07-22T13:15:13.771935+00:00 app[web.1]: [AV] Running command: if command -v avprobe 2>/dev/null; then echo "true"; else echo "false"; fi
    2016-07-22T13:15:13.773078+00:00 app[web.1]: [AV] Running command: if command -v ffmpeg 2>/dev/null; then echo "true"; else echo "false"; fi
    2016-07-22T13:15:13.774121+00:00 app[web.1]: [AV] Found ["ffmpeg"], using: Ffmpeg
    2016-07-22T13:15:13.774159+00:00 app[web.1]: [AV] Running command: if command -v avprobe 2>/dev/null; then echo "true"; else echo "false"; fi
    2016-07-22T13:15:13.775225+00:00 app[web.1]: [AV] Running command: if command -v ffmpeg 2>/dev/null; then echo "true"; else echo "false"; fi
    2016-07-22T13:15:13.776771+00:00 app[web.1]: [AV] Found ["ffmpeg"], using: Ffmpeg
    2016-07-22T13:15:13.776807+00:00 app[web.1]: [AV] Running command: ffmpeg -i "/tmp/33028ec79c8028f75908c90d9f018aeb20160722-3-xbemwt.mp4" 2>&1
    2016-07-22T13:15:13.814982+00:00 app[web.1]: [paperclip] [transcoder] Transocding supported file /tmp/33028ec79c8028f75908c90d9f018aeb20160722-3-xbemwt.mp4
    2016-07-22T13:15:13.815056+00:00 app[web.1]: [AV] Adding output parameter ["acodec", "aac"]
    2016-07-22T13:15:13.815103+00:00 app[web.1]: [AV] Adding output parameter ["strict", "experimental"]
    2016-07-22T13:15:13.815289+00:00 app[web.1]: [AV] Adding output parameter [:s, "640x480"]
    2016-07-22T13:15:13.815379+00:00 app[web.1]: [AV] Running command: ffmpeg -i "/tmp/33028ec79c8028f75908c90d9f018aeb20160722-3-xbemwt.mp4" -acodec aac -strict experimental -s 640x480 -y "/tmp/33028ec79c8028f75908c90d9f018aeb20160722-3-xbemwt20160722-3-1pwdg2k.mp4"
    2016-07-22T13:15:43.237749+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/courses/5/sections/7/lessons/11" host=xxxxx.herokuapp.com request_id=a1408ac7-c7c3-40f4-8365-86156d2d2314 fwd="43.255.56.1" dyno=web.1 connect=0ms service=188655ms status=503 bytes=0
  • No such file or directory - the ffprobe binary could not be found error

    22 juin 2016, par rahul

    I am using carrierwave-video gem uploading videos through carrierwave and it’s not working.

    video_uploader.rb

    class VideoUploader < CarrierWave::Uploader::Base
     include CarrierWave::Video
     storage :file
     def store_dir
       "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
     end
    end

    video.rb

    class Video < ActiveRecord::Base
     mount_uploader :file, VideoUploader

     def set_success(format, opts)
       self.success = true
     end
    end

    The error I am getting is :

    No such file or directory - the ffprobe binary could not be found in /home/administrator/.rvm/gems/ruby-2.3.0/bin:/home/administrator/.rvm/gems/ruby-2.3.0@global/bin:/usr/share/rvm/rubies/ruby-2.3.0/bin:/usr/share/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games