Recherche avancée

Médias (1)

Mot : - Tags -/école

Autres articles (18)

  • Multilang : améliorer l’interface pour les blocs multilingues

    18 février 2011, par

    Multilang est un plugin supplémentaire qui n’est pas activé par défaut lors de l’initialisation de MediaSPIP.
    Après son activation, une préconfiguration est mise en place automatiquement par MediaSPIP init permettant à la nouvelle fonctionnalité d’être automatiquement opérationnelle. Il n’est donc pas obligatoire de passer par une étape de configuration pour cela.

  • Librairies et logiciels spécifiques aux médias

    10 décembre 2010, par

    Pour un fonctionnement correct et optimal, plusieurs choses sont à prendre en considération.
    Il est important, après avoir installé apache2, mysql et php5, d’installer d’autres logiciels nécessaires dont les installations sont décrites dans les liens afférants. Un ensemble de librairies multimedias (x264, libtheora, libvpx) utilisées pour l’encodage et le décodage des vidéos et sons afin de supporter le plus grand nombre de fichiers possibles. Cf. : ce tutoriel ; FFMpeg avec le maximum de décodeurs et (...)

  • 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

Sur d’autres sites (4643)

  • x264 encoding severe quality loss

    1er septembre 2020, par SolskGaer

    I used this repo to encode a mjpeg stream to a h264 one, but the output is not so good. The stream is a series of screenshot of an iPhone. In the output stream, even the lines between two items in the settings app are gone. How do I improve the output stream quality ?
Here is the code snippet that x264-go use to init an encoder

    


    func NewEncoder(w io.Writer, opts *Options) (e *Encoder, err error) {
    e = &Encoder{}

    e.w = w
    e.pts = 0
    e.opts = opts

    e.csp = x264c.CspI420

    e.nals = make([]*x264c.Nal, 3)
    e.img = NewYCbCr(image.Rect(0, 0, e.opts.Width, e.opts.Height))

    param := x264c.Param{}

    if e.opts.Preset != "" && e.opts.Profile != "" {
        ret := x264c.ParamDefaultPreset(&param, e.opts.Preset, e.opts.Tune)
        if ret < 0 {
            err = fmt.Errorf("x264: invalid preset/tune name")
            return
        }
    } else {
        x264c.ParamDefault(&param)
    }

    param.IWidth = int32(e.opts.Width)
    param.IHeight = int32(e.opts.Height)

    param.ICsp = e.csp
    param.BVfrInput = 0
    param.BRepeatHeaders = 1
    param.BAnnexb = 1

    param.ILogLevel = e.opts.LogLevel

    if e.opts.FrameRate > 0 {
        param.IFpsNum = uint32(e.opts.FrameRate)
        param.IFpsDen = 1

        param.IKeyintMax = int32(e.opts.FrameRate)
        param.BIntraRefresh = 1
    }

    if e.opts.Profile != "" {
        ret := x264c.ParamApplyProfile(&param, e.opts.Profile)
        if ret < 0 {
            err = fmt.Errorf("x264: invalid profile name")
            return
        }
    }

    // Allocate on create instead while encoding
    var picIn x264c.Picture
    ret := x264c.PictureAlloc(&picIn, e.csp, int32(e.opts.Width), int32(e.opts.Height))
    if ret < 0 {
        err = fmt.Errorf("x264: cannot allocate picture")
        return
    }
    e.picIn = picIn
    defer func() {
        // Cleanup if intialization fail
        if err != nil {
            x264c.PictureClean(&picIn)
        }
    }()

    e.e = x264c.EncoderOpen(&param)
    if e.e == nil {
        err = fmt.Errorf("x264: cannot open the encoder")
        return
    }

    ret = x264c.EncoderHeaders(e.e, e.nals, &e.nnals)
    if ret < 0 {
        err = fmt.Errorf("x264: cannot encode headers")
        return
    }

    if ret > 0 {
        b := C.GoBytes(e.nals[0].PPayload, C.int(ret))
        n, er := e.w.Write(b)
        if er != nil {
            err = er
            return
        }

        if int(ret) != n {
            err = fmt.Errorf("x264: error writing headers, size=%d, n=%d", ret, n)
        }
    }

    return
}


    


    and the encoder option is defined as

    


    opts := &x264.Options{
        Width:     int(width)/2*2,
        Height:    int(height)/2*2,
        FrameRate: 15,
        Tune:      "zerolatency",
        Preset:    "medium",
        Profile:   "baseline",
        LogLevel:  x264.LogNone,
    }


    


    And I also used ffmpeg(though the api is pretty old)

    


    package screencast&#xA;&#xA;import (&#xA;&#xA;    /*&#xA;        #include &#xA;        #include &#xA;        #include &#xA;        #include &#xA;        #include <libavcodec></libavcodec>avcodec.h>&#xA;        #include <libavformat></libavformat>avformat.h>&#xA;        #include <libavutil></libavutil>avutil.h>&#xA;        #include <libavutil></libavutil>opt.h>&#xA;        #include <libavutil></libavutil>channel_layout.h>&#xA;        #include <libavutil></libavutil>common.h>&#xA;        #include <libavutil></libavutil>imgutils.h>&#xA;        #include <libavutil></libavutil>mathematics.h>&#xA;        #include <libavutil></libavutil>samplefmt.h>&#xA;&#xA;        typedef struct {&#xA;            int w, h;&#xA;            int pixfmt;&#xA;            char *preset[2];&#xA;            char *profile;&#xA;            int bitrate;&#xA;            int got;&#xA;            AVCodec *c;&#xA;            AVCodecContext *ctx;&#xA;            AVFrame *f;&#xA;            AVPacket pkt;&#xA;        } h264enc_t;&#xA;&#xA;        static int h264enc_new(h264enc_t *m) {&#xA;            m->c = avcodec_find_encoder(AV_CODEC_ID_H264);&#xA;            m->ctx = avcodec_alloc_context3(m->c);&#xA;            m->ctx->width = m->w;&#xA;            m->ctx->height = m->h;&#xA;            m->ctx->pix_fmt = m->pixfmt;&#xA;            m->ctx->time_base = (AVRational){1,10};&#xA;            av_opt_set(m->ctx->priv_data, "preset", "slow", 0);&#xA;            av_opt_set(m->ctx->priv_data, "tune", "zerolatency", 0);&#xA;            av_opt_set(m->ctx->priv_data, "profile", "baseline", 0);&#xA;            av_opt_set(m->ctx->priv_data, "crf", "18.0.", 0);&#xA;            m->f = av_frame_alloc();&#xA;            m->f->format = m->ctx->pix_fmt;&#xA;            m->f->width = m->ctx->width;&#xA;            m->f->height = m->ctx->height;&#xA;            avcodec_open2(m->ctx, m->c, NULL);&#xA;            return av_image_alloc(m->f->data, m->f->linesize, m->ctx->width, m->ctx->height, m->ctx->pix_fmt, 32);&#xA;        }&#xA;&#xA;    */&#xA;    "C"&#xA;    "errors"&#xA;    "image"&#xA;    "unsafe"&#xA;    //"log"&#xA;)&#xA;&#xA;type H264Encoder struct {&#xA;    m      C.h264enc_t&#xA;    Header []byte&#xA;    Pixfmt image.YCbCrSubsampleRatio&#xA;    W, H   int&#xA;    pts    int&#xA;}&#xA;&#xA;func NewH264Encoder(w, h int) (m *H264Encoder, err error) {&#xA;    m = &amp;H264Encoder{}&#xA;    m.m.w = (C.int)(w)&#xA;    m.m.h = (C.int)(h)&#xA;    m.W = w&#xA;    m.H = h&#xA;    m.Pixfmt = image.YCbCrSubsampleRatio420&#xA;    m.m.pixfmt = C.AV_PIX_FMT_YUV420P&#xA;    r := C.h264enc_new(&amp;m.m)&#xA;    if int(r) &lt; 0 {&#xA;        err = errors.New("open encoder failed")&#xA;        return&#xA;    }&#xA;    return&#xA;}&#xA;&#xA;func (m *H264Encoder) Encode(img *image.YCbCr) (data []byte, err error) {&#xA;    var f *C.AVFrame&#xA;    if img == nil {&#xA;        f = nil&#xA;    } else {&#xA;        if img.SubsampleRatio != m.Pixfmt {&#xA;            err = errors.New("image pixfmt not match")&#xA;            return&#xA;        }&#xA;        if img.Rect.Dx() != m.W || img.Rect.Dy() != m.H {&#xA;            err = errors.New("image size not match")&#xA;            return&#xA;        }&#xA;        f = m.m.f&#xA;        f.data[0] = (*C.uint8_t)(unsafe.Pointer(&amp;img.Y[0]))&#xA;        f.data[1] = (*C.uint8_t)(unsafe.Pointer(&amp;img.Cb[0]))&#xA;        f.data[2] = (*C.uint8_t)(unsafe.Pointer(&amp;img.Cr[0]))&#xA;        f.linesize[0] = (C.int)(img.YStride)&#xA;        f.linesize[1] = (C.int)(img.CStride)&#xA;        f.linesize[2] = (C.int)(img.CStride)&#xA;    }&#xA;&#xA;    C.av_init_packet(&amp;m.m.pkt)&#xA;    m.m.pkt.data = nil&#xA;    m.m.pkt.size = 0&#xA;    f.pts = (C.longlong)(m.pts)&#xA;    m.pts&#x2B;&#x2B;&#xA;    r := C.avcodec_encode_video2(m.m.ctx, &amp;m.m.pkt, f, &amp;m.m.got)&#xA;    defer C.av_packet_unref(&amp;m.m.pkt)&#xA;    if int(r) &lt; 0 {&#xA;        err = errors.New("encode failed")&#xA;        return&#xA;    }&#xA;    if m.m.got == 0 {&#xA;        err = errors.New("no picture")&#xA;        return&#xA;    }&#xA;    if m.m.pkt.size == 0 {&#xA;        err = errors.New("packet size == 0")&#xA;        return&#xA;    }&#xA;&#xA;    data = make([]byte, m.m.pkt.size)&#xA;    C.memcpy(&#xA;        unsafe.Pointer(&amp;data[0]),&#xA;        unsafe.Pointer(m.m.pkt.data),&#xA;        (C.size_t)(m.m.pkt.size),&#xA;    )&#xA;    return data, nil&#xA;}&#xA;

    &#xA;

    but got the same output. However, when I use the ffmpeg binary, the result was pretty good, so I guess I set wrong parameters, but I don't know which.&#xA;Any suggestion would be appreciated. If you have better way to achieve this, I'll appreciate it.

    &#xA;

    For your information : I must do this using golang.

    &#xA;

    screenshot of output stream

    &#xA;

  • ffmpeg fix video orientation

    22 juillet 2020, par PiTheNumber

    A video can contain a meta info about the camera orientation. For example iPhone and other phones set this flag if you turn the device. Problem is while some player read this info and rotate the video accordingly, other players do not.

    &#xA;&#xA;

    To fix this the video has to be rotated and the meta info needs to be set correctly.

    &#xA;&#xA;

    Does ffmpeg provide a fix for this or do I have to go the hard way (Read rotation, rotate, set meta data)

    &#xA;

  • ffmpeg - Remove slow motion from MOV

    16 juillet 2020, par KalemKutu

    I recorded a short movie with an iPhone.&#xA;No idea how I did, but a part of the video is in slow motion.

    &#xA;

    I want to play but also store the video on my computer MAC in "normal" speed,&#xA;if possible without losing quality & without encoding.

    &#xA;

    I tried following parameters in ffmpeg, which works.&#xA;But I have the feeling the outcome quality has reduced "little-bit".

    &#xA;

    ffmpeg -i input.MOV -r 30  output.MOV&#xA;

    &#xA;

    Is there a better way ?

    &#xA;

    Thanks, Kalem

    &#xA;