Recherche avancée

Médias (1)

Mot : - Tags -/getid3

Autres articles (69)

  • Websites made ​​with MediaSPIP

    2 mai 2011, par

    This page lists some websites based on MediaSPIP.

  • MediaSPIP v0.2

    21 juin 2013, par

    MediaSPIP 0.2 est la première version de MediaSPIP stable.
    Sa date de sortie officielle est le 21 juin 2013 et est annoncée ici.
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Comme pour la version précédente, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
    Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...)

  • 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" (...)

Sur d’autres sites (7237)

  • Trouble syncing libavformat/ffmpeg with x264 and RTP

    26 décembre 2012, par Jacob Peddicord

    I've been working on some streaming software that takes live feeds
    from various kinds of cameras and streams over the network using
    H.264. To accomplish this, I'm using the x264 encoder directly (with
    the "zerolatency" preset) and feeding NALs as they are available to
    libavformat to pack into RTP (ultimately RTSP). Ideally, this
    application should be as real-time as possible. For the most part,
    this has been working well.

    Unfortunately, however, there is some sort of synchronization issue :
    any video playback on clients seems to show a few smooth frames,
    followed by a short pause, then more frames ; repeat. Additionally,
    there appears to be approximately a 4-second delay. This happens with
    every video player I've tried : Totem, VLC, and basic gstreamer pipes.

    I've boiled it all down to a somewhat small test case :

    #include
    #include
    #include
    #include
    #include <libavformat></libavformat>avformat.h>
    #include <libswscale></libswscale>swscale.h>

    #define WIDTH       640
    #define HEIGHT      480
    #define FPS         30
    #define BITRATE     400000
    #define RTP_ADDRESS "127.0.0.1"
    #define RTP_PORT    49990

    struct AVFormatContext* avctx;
    struct x264_t* encoder;
    struct SwsContext* imgctx;

    uint8_t test = 0x80;


    void create_sample_picture(x264_picture_t* picture)
    {
       // create a frame to store in
       x264_picture_alloc(picture, X264_CSP_I420, WIDTH, HEIGHT);

       // fake image generation
       // disregard how wrong this is; just writing a quick test
       int strides = WIDTH / 8;
       uint8_t* data = malloc(WIDTH * HEIGHT * 3);
       memset(data, test, WIDTH * HEIGHT * 3);
       test = (test &lt;&lt; 1) | (test >> (8 - 1));

       // scale the image
       sws_scale(imgctx, (const uint8_t* const*) &amp;data, &amp;strides, 0, HEIGHT,
                 picture->img.plane, picture->img.i_stride);
    }

    int encode_frame(x264_picture_t* picture, x264_nal_t** nals)
    {
       // encode a frame
       x264_picture_t pic_out;
       int num_nals;
       int frame_size = x264_encoder_encode(encoder, nals, &amp;num_nals, picture, &amp;pic_out);

       // ignore bad frames
       if (frame_size &lt; 0)
       {
           return frame_size;
       }

       return num_nals;
    }

    void stream_frame(uint8_t* payload, int size)
    {
       // initalize a packet
       AVPacket p;
       av_init_packet(&amp;p);
       p.data = payload;
       p.size = size;
       p.stream_index = 0;
       p.flags = AV_PKT_FLAG_KEY;
       p.pts = AV_NOPTS_VALUE;
       p.dts = AV_NOPTS_VALUE;

       // send it out
       av_interleaved_write_frame(avctx, &amp;p);
    }

    int main(int argc, char* argv[])
    {
       // initalize ffmpeg
       av_register_all();

       // set up image scaler
       // (in-width, in-height, in-format, out-width, out-height, out-format, scaling-method, 0, 0, 0)
       imgctx = sws_getContext(WIDTH, HEIGHT, PIX_FMT_MONOWHITE,
                               WIDTH, HEIGHT, PIX_FMT_YUV420P,
                               SWS_FAST_BILINEAR, NULL, NULL, NULL);

       // set up encoder presets
       x264_param_t param;
       x264_param_default_preset(&amp;param, "ultrafast", "zerolatency");

       param.i_threads = 3;
       param.i_width = WIDTH;
       param.i_height = HEIGHT;
       param.i_fps_num = FPS;
       param.i_fps_den = 1;
       param.i_keyint_max = FPS;
       param.b_intra_refresh = 0;
       param.rc.i_bitrate = BITRATE;
       param.b_repeat_headers = 1; // whether to repeat headers or write just once
       param.b_annexb = 1;         // place start codes (1) or sizes (0)

       // initalize
       x264_param_apply_profile(&amp;param, "high");
       encoder = x264_encoder_open(&amp;param);

       // at this point, x264_encoder_headers can be used, but it has had no effect

       // set up streaming context. a lot of error handling has been ommitted
       // for brevity, but this should be pretty standard.
       avctx = avformat_alloc_context();
       struct AVOutputFormat* fmt = av_guess_format("rtp", NULL, NULL);
       avctx->oformat = fmt;

       snprintf(avctx->filename, sizeof(avctx->filename), "rtp://%s:%d", RTP_ADDRESS, RTP_PORT);
       if (url_fopen(&amp;avctx->pb, avctx->filename, URL_WRONLY) &lt; 0)
       {
           perror("url_fopen failed");
           return 1;
       }
       struct AVStream* stream = av_new_stream(avctx, 1);

       // initalize codec
       AVCodecContext* c = stream->codec;
       c->codec_id = CODEC_ID_H264;
       c->codec_type = AVMEDIA_TYPE_VIDEO;
       c->flags = CODEC_FLAG_GLOBAL_HEADER;
       c->width = WIDTH;
       c->height = HEIGHT;
       c->time_base.den = FPS;
       c->time_base.num = 1;
       c->gop_size = FPS;
       c->bit_rate = BITRATE;
       avctx->flags = AVFMT_FLAG_RTP_HINT;

       // write the header
       av_write_header(avctx);

       // make some frames
       for (int frame = 0; frame &lt; 10000; frame++)
       {
           // create a sample moving frame
           x264_picture_t* pic = (x264_picture_t*) malloc(sizeof(x264_picture_t));
           create_sample_picture(pic);

           // encode the frame
           x264_nal_t* nals;
           int num_nals = encode_frame(pic, &amp;nals);

           if (num_nals &lt; 0)
               printf("invalid frame size: %d\n", num_nals);

           // send out NALs
           for (int i = 0; i &lt; num_nals; i++)
           {
               stream_frame(nals[i].p_payload, nals[i].i_payload);
           }

           // free up resources
           x264_picture_clean(pic);
           free(pic);

           // stream at approx 30 fps
           printf("frame %d\n", frame);
           usleep(33333);
       }

       return 0;
    }

    This test shows black lines on a white background that
    should move smoothly to the left. It has been written for ffmpeg 0.6.5
    but the problem can be reproduced on 0.8 and 0.10 (from what I've tested so far). I've taken some shortcuts in error handling to make this example as short as
    possible while still showing the problem, so please excuse some of the
    nasty code. I should also note that while an SDP is not used here, I
    have tried using that already with similar results. The test can be
    compiled with :

    gcc -g -std=gnu99 streamtest.c -lswscale -lavformat -lx264 -lm -lpthread -o streamtest

    It can be played with gtreamer directly :

    gst-launch udpsrc port=49990 ! application/x-rtp,payload=96,clock-rate=90000 ! rtph264depay ! decodebin ! xvimagesink

    You should immediately notice the stuttering. One common "fix" I've
    seen all over the Internet is to add sync=false to the pipeline :

    gst-launch udpsrc port=49990 ! application/x-rtp,payload=96,clock-rate=90000 ! rtph264depay ! decodebin ! xvimagesink sync=false

    This causes playback to be smooth (and near-realtime), but is a
    non-solution and only works with gstreamer. I'd like to fix the
    problem at the source. I've been able to stream with near-identical
    parameters using raw ffmpeg and haven't had any issues :

    ffmpeg -re -i sample.mp4 -vcodec libx264 -vpre ultrafast -vpre baseline -b 400000 -an -f rtp rtp://127.0.0.1:49990 -an

    So clearly I'm doing something wrong. But what is it ?

  • Encoding YUV file (uncompressed video) to mp4 playable file using H264 encoding with ffmpeg c++ (NOT command line)

    20 avril 2023, par devprog

    My goal is to encode a yuv file to a playable mp4 file (can be played with VLC) with ffmpeg c++ code.

    &#xA;

    First I have a source_1920x1080p30.mpg video (compressed) file.&#xA;Using ffmpeg CLI I created output_test.yuv file.&#xA;ffmpeg -i source_1920x1080p30.mpg -c:v rawvideo -pix_fmt yuv420p output_test.yuv

    &#xA;

    I used ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 output_test.yuv which played well.&#xA;Also used ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -r 30 -i output_test.yuv -c:v libx264 vid.mp4&#xA;and the new vid.mp4 was playble.&#xA;So I have good yuv file.

    &#xA;

    I want to encode this output_test.yuv YUV file with ffmpeg by code.&#xA;I tested the ffmpeg site encode example ffmpeg site encode example and it was running good.

    &#xA;

    In that example, the frames are self made inside the code - But I want that the input would be my YUV file.

    &#xA;

    Becasue I used ffmpeg CLI to convert YUV to mp4 (as noted above) I am sure it can be done by code - but I dont how..

    &#xA;

    So, I tried to add to their example the use of the methods :&#xA;avformat_open_input() & avformat_find_stream_info()

    &#xA;

    #include &#xA;#include &#xA;#include &#xA;&#xA;extern "C" {&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA; &#xA;#include <libavutil></libavutil>opt.h>&#xA;#include <libavutil></libavutil>imgutils.h>&#xA;} &#xA;// ffmpeg method.&#xA;static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt,&#xA;                   FILE *outfile)&#xA;{&#xA;    int ret;&#xA; &#xA;    /* send the frame to the encoder */&#xA;    if (frame)&#xA;        printf("Send frame %3" PRId64 "\n", frame->pts);&#xA; &#xA;    ret = avcodec_send_frame(enc_ctx, frame);&#xA;    if (ret &lt; 0) {&#xA;        fprintf(stderr, "Error sending a frame for encoding\n");&#xA;        exit(1);&#xA;    }&#xA; &#xA;    while (ret >= 0) {&#xA;        ret = avcodec_receive_packet(enc_ctx, pkt);&#xA;        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)&#xA;            return;&#xA;        else if (ret &lt; 0) {&#xA;            fprintf(stderr, "Error during encoding\n");&#xA;            exit(1);&#xA;        }&#xA; &#xA;        printf("Write packet %3" PRId64 " (size=%5d)\n", pkt->pts, pkt->size);&#xA;        fwrite(pkt->data, 1, pkt->size, outfile);&#xA;        av_packet_unref(pkt);&#xA;    }&#xA;}&#xA;&#xA;int main(int argc, char **argv)&#xA;{&#xA;    &#xA;    int ret;&#xA;    char errbuf[100];&#xA;&#xA;    AVFormatContext* ifmt_ctx = avformat_alloc_context();&#xA;&#xA;    AVDictionary* options = NULL;&#xA;    //av_dict_set(&amp;options, "framerate", "30", 0);&#xA;    av_dict_set(&amp;options, "video_size", "1920x1080", 0);&#xA;    av_dict_set(&amp;options,"pixel_format", "yuv420p",0);&#xA;    av_dict_set(&amp;options, "vcodec", "rawvideo", 0);&#xA;&#xA;    if ((ret = avformat_open_input(&amp;ifmt_ctx, "output_test.yuv", NULL, &amp;options)) &lt; 0) {&#xA;        av_strerror(ret, errbuf, sizeof(errbuf));&#xA;        fprintf(stderr, "Unable to open err=%s\n", errbuf);&#xA;    }&#xA;&#xA;    const AVCodec *pCodec = avcodec_find_decoder(AV_CODEC_ID_RAWVIDEO); //Get pointer to rawvideo codec.&#xA;&#xA;    AVCodecContext *pCodecContext = avcodec_alloc_context3(pCodec); //Allocate codec context.&#xA;&#xA;    //Fill the codec context based on the values from the codec parameters.&#xA;    AVStream *vid_stream = ifmt_ctx->streams[0];&#xA;    avcodec_parameters_to_context(pCodecContext, vid_stream->codecpar);&#xA;&#xA;    avcodec_open2(pCodecContext, pCodec, NULL); //Open the codec&#xA;&#xA;    //Allocate memory for packet and frame&#xA;    AVPacket *pPacket = av_packet_alloc();&#xA;    AVFrame *pFrame = av_frame_alloc();&#xA;&#xA;    // For output use:&#xA;    &#xA;    const char *filename, *codec_name;&#xA;    const AVCodec *codec;&#xA;    AVCodecContext *c= NULL;&#xA;    int i, x, y;&#xA;    FILE *f;&#xA;    // origin ffmpeg code - AVFrame *frame;&#xA;    AVPacket *pkt;&#xA;    uint8_t endcode[] = { 0, 0, 1, 0xb7 };&#xA; &#xA;    if (argc &lt;= 2) {&#xA;        fprintf(stderr, "Usage: %s <output file="file"> <codec>\n", argv[0]);&#xA;        exit(0);&#xA;    }&#xA;    filename = argv[1];&#xA;    codec_name = argv[2];&#xA; &#xA;    /* find the mpeg1video encoder */&#xA;    codec = avcodec_find_encoder_by_name(codec_name);&#xA;    if (!codec) {&#xA;        fprintf(stderr, "Codec &#x27;%s&#x27; not found\n", codec_name);&#xA;        exit(1);&#xA;    }&#xA; &#xA;    c = avcodec_alloc_context3(codec);&#xA;    if (!c) {&#xA;        fprintf(stderr, "Could not allocate video codec context\n");&#xA;        exit(1);&#xA;    }&#xA; &#xA;    pkt = av_packet_alloc();&#xA;    if (!pkt)&#xA;        exit(1);&#xA; &#xA;    /* put sample parameters */&#xA;    c->bit_rate = 400000;&#xA;    /* resolution must be a multiple of two */&#xA;    c->width = 352;&#xA;    c->height = 288;&#xA;    /* frames per second */&#xA;    c->time_base = (AVRational){1, 25};&#xA;    c->framerate = (AVRational){25, 1};&#xA; &#xA;    /* emit one intra frame every ten frames&#xA;     * check frame pict_type before passing frame&#xA;     * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I&#xA;     * then gop_size is ignored and the output of encoder&#xA;     * will always be I frame irrespective to gop_size&#xA;     */&#xA;    c->gop_size = 10;&#xA;    c->max_b_frames = 1;&#xA;    c->pix_fmt = AV_PIX_FMT_YUV420P;&#xA; &#xA;    if (codec->id == AV_CODEC_ID_H264)&#xA;        av_opt_set(c->priv_data, "preset", "slow", 0);&#xA; &#xA;    /* open it */&#xA;    ret = avcodec_open2(c, codec, NULL);&#xA;    if (ret &lt; 0) {&#xA;        //fprintf(stderr, "Could not open codec: %s\n", av_err2str(ret));&#xA;        exit(1);&#xA;    }&#xA; &#xA;    f = fopen(filename, "wb");&#xA;    if (!f) {&#xA;        fprintf(stderr, "Could not open %s\n", filename);&#xA;        exit(1);&#xA;    }&#xA;// This is ffmpeg code that I removed   &#xA;//    frame = av_frame_alloc();&#xA;//    if (!frame) {&#xA;//        fprintf(stderr, "Could not allocate video frame\n");&#xA;//        exit(1);&#xA;//    }&#xA;//    frame->format = c->pix_fmt;&#xA;//    frame->width  = c->width;&#xA;//    frame->height = c->height;&#xA;// &#xA;//    ret = av_frame_get_buffer(frame, 0);&#xA;//    if (ret &lt; 0) {&#xA;//        fprintf(stderr, "Could not allocate the video frame data\n");&#xA;//        exit(1);&#xA;//    }&#xA;&#xA;    pFrame->format = c->pix_fmt;&#xA;    pFrame->width  = c->width;&#xA;    pFrame->height = c->height;&#xA;    &#xA;&#xA;    //Read video frames and pass through the decoder.&#xA;    //Note: Since the video is rawvideo, we don&#x27;t really have to pass it through the decoder.&#xA;    while (av_read_frame(ifmt_ctx, pPacket) >= 0) &#xA;    {&#xA;        //The video is not encoded - passing through the decoder is simply copy the data.&#xA;        avcodec_send_packet(pCodecContext, pPacket);    //Supply raw packet data as input to the "decoder".&#xA;        avcodec_receive_frame(pCodecContext, pFrame);   //Return decoded output data from the "decoder".&#xA;&#xA;        fflush(stdout);&#xA;// This is ffmpeg code that I removed  &#xA;//        /* Make sure the frame data is writable.&#xA;//           On the first round, the frame is fresh from av_frame_get_buffer()&#xA;//           and therefore we know it is writable.&#xA;//           But on the next rounds, encode() will have called&#xA;//           avcodec_send_frame(), and the codec may have kept a reference to&#xA;//           the frame in its internal structures, that makes the frame&#xA;//           unwritable.&#xA;//           av_frame_make_writable() checks that and allocates a new buffer&#xA;//           for the frame only if necessary.&#xA;//         */&#xA;//        ret = av_frame_make_writable(frame);&#xA;//        if (ret &lt; 0)&#xA;//            exit(1);&#xA;// &#xA;//        /* Prepare a dummy image.&#xA;//           In real code, this is where you would have your own logic for&#xA;//           filling the frame. FFmpeg does not care what you put in the&#xA;//           frame.&#xA;//         */&#xA;//        /* Y */&#xA;//        for (y = 0; y &lt; c->height; y&#x2B;&#x2B;) {&#xA;//            for (x = 0; x &lt; c->width; x&#x2B;&#x2B;) {&#xA;//                frame->data[0][y * frame->linesize[0] &#x2B; x] = x &#x2B; y &#x2B; i * 3;&#xA;//            }&#xA;//        }&#xA;// &#xA;//        /* Cb and Cr */&#xA;//        for (y = 0; y &lt; c->height/2; y&#x2B;&#x2B;) {&#xA;//            for (x = 0; x &lt; c->width/2; x&#x2B;&#x2B;) {&#xA;//                frame->data[1][y * frame->linesize[1] &#x2B; x] = 128 &#x2B; y &#x2B; i * 2;&#xA;//                frame->data[2][y * frame->linesize[2] &#x2B; x] = 64 &#x2B; x &#x2B; i * 5;&#xA;//            }&#xA;//        }&#xA; &#xA;        pFrame->pts = i;&#xA; &#xA;        /* encode the image */&#xA;        encode(c, pFrame, pkt, f);&#xA;    }&#xA; &#xA;    /* flush the encoder */&#xA;    encode(c, NULL, pkt, f);&#xA; &#xA;    /* Add sequence end code to have a real MPEG file.&#xA;       It makes only sense because this tiny examples writes packets&#xA;       directly. This is called "elementary stream" and only works for some&#xA;       codecs. To create a valid file, you usually need to write packets&#xA;       into a proper file format or protocol; see mux.c.&#xA;     */&#xA;    if (codec->id == AV_CODEC_ID_MPEG1VIDEO || codec->id == AV_CODEC_ID_MPEG2VIDEO)&#xA;        fwrite(endcode, 1, sizeof(endcode), f);&#xA;    fclose(f);&#xA; &#xA;    avcodec_free_context(&amp;c);&#xA;    av_frame_free(&amp;pFrame);&#xA;    av_packet_free(&amp;pkt);&#xA; &#xA;    return 0;&#xA;}&#xA;</codec></output>

    &#xA;

    EDIT : I added combined code of ffmpeg and reading/decoding from YUV file according @Rotem (thanks). Frame from decoder pushed right to encode() method of ffmpeg. The out video was not good... Should I manipulate the YUV input frame before send it to encode() method ? if yes how to do it ?

    &#xA;

  • FFmpeg avcodec_open2 throws -22 ("Invalid Argument")

    14 avril 2023, par stupidbutseeking

    I got stuck trying to write a simple video conversion using C++ and ffmpeg.

    &#xA;

    When trying to convert a video using FFmpeg, calling avcodec_open2 fails with the code "-22" which seems to be an "Invalid Argument"-error.

    &#xA;

    I can't figure out why it fails, nor what the invalid argument is. In the following snippet I create the output codec and pass its context the information from the source (code further down below).

    &#xA;

    The check for the "outputCodec" works and does not throw an error. As far as I know an "AVDictionary"-argument is optional. So I guess the reason for the error is the context.

    &#xA;

        const AVCodec* outputCodec = avcodec_find_encoder_by_name(codecName.c_str());&#xA;&#xA;    if (!outputCodec)&#xA;    {&#xA;        std::cout &lt;&lt; "Zielformat-Codec nicht gefunden" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    AVCodecContext* outputCodecContext = avcodec_alloc_context3(outputCodec);&#xA;    outputCodecContext->bit_rate = bitRate;&#xA;    outputCodecContext->width = inputCodecContext->width;&#xA;    outputCodecContext->height = inputCodecContext->height;&#xA;    outputCodecContext->pix_fmt = outputCodec->pix_fmts[0];&#xA;    outputCodecContext->time_base = inputCodecContext->time_base;&#xA;&#xA;    **int errorCode = avcodec_open2(outputCodecContext, outputCodec, NULL); //THIS RETURNS -22**&#xA;    if (errorCode != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim &#xD6;ffnen des Zielformat-Codecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;

    &#xA;

    Here is the code for getting the input file & context :

    &#xA;

        std::string inputFilename = "input_video.mp4";&#xA;    std::string outputFilename = "output.avi";&#xA;    std::string codecName = "mpeg4";&#xA;    int bitRate = 400000;&#xA;&#xA;    AVFormatContext* inputFormatContext = NULL;&#xA;    if (avformat_open_input(&amp;inputFormatContext, inputFilename.c_str(), NULL, NULL) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim &#xD6;ffnen der Eingabedatei" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    [Do Video Stream Search)&#xA;&#xA;    AVCodecParameters* inputCodecParameters = inputFormatContext->streams[videoStreamIndex]->codecpar;&#xA;    const AVCodec* inputCodec = avcodec_find_decoder(inputCodecParameters->codec_id);&#xA;    AVCodecContext* inputCodecContext = avcodec_alloc_context3(inputCodec);&#xA;    if (avcodec_parameters_to_context(inputCodecContext, inputCodecParameters) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim Setzen des Eingabecodecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;    if (avcodec_open2(inputCodecContext, inputCodec, NULL) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim &#xD6;ffnen des Eingabecodecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;

    &#xA;

    The purpose was simply to get started with ffmpeg in an own C++ project.

    &#xA;

    If it is of any need, I downloaded the ffmpeg libs from here. I used the gpl shared ones. The architecture is win x64. I referenced them through the project properties (additional libraries and so on).

    &#xA;

    I tried to convert a .mp4 video to an .avi video with an "mpeg4" compression.&#xA;I also tried other compressions like "libx264" but none worked.

    &#xA;

    I searched for the problem on stackoverflow but could not find the exact same problem. While its purpose is different this post is about the same error code when calling avcodec_open2. But its solution is not working for me. I inspected the watch for the "outputContext" while running the code and the codec_id, codec_type and format is set. I use the time_base from the input file. According to my understanding, this should be equal to the source. So I can not find out what I am missing.

    &#xA;

    Thanks in advance and sorry for my english.

    &#xA;

    And for completion, here is the whole method :

    &#xA;

    int TestConvert()&#xA;{&#xA;    std::string inputFilename = "input_video.mp4";&#xA;    std::string outputFilename = "output.avi";&#xA;    std::string codecName = "mpeg4";&#xA;    int bitRate = 400000;&#xA;&#xA;    AVFormatContext* inputFormatContext = NULL;&#xA;    if (avformat_open_input(&amp;inputFormatContext, inputFilename.c_str(), NULL, NULL) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim &#xD6;ffnen der Eingabedatei" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    int videoStreamIndex = -1;&#xA;    for (unsigned int i = 0; i &lt; inputFormatContext->nb_streams; i&#x2B;&#x2B;)&#xA;    {&#xA;        if (inputFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)&#xA;        {&#xA;            videoStreamIndex = i;&#xA;            break;&#xA;        }&#xA;    }&#xA;&#xA;    AVCodecParameters* inputCodecParameters = inputFormatContext->streams[videoStreamIndex]->codecpar;&#xA;    const AVCodec* inputCodec = avcodec_find_decoder(inputCodecParameters->codec_id);&#xA;    AVCodecContext* inputCodecContext = avcodec_alloc_context3(inputCodec);&#xA;    if (avcodec_parameters_to_context(inputCodecContext, inputCodecParameters) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim Setzen des Eingabecodecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;    if (avcodec_open2(inputCodecContext, inputCodec, NULL) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim &#xD6;ffnen des Eingabecodecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    const AVCodec* outputCodec = avcodec_find_encoder_by_name(codecName.c_str());&#xA;&#xA;    if (!outputCodec)&#xA;    {&#xA;        std::cout &lt;&lt; "Zielformat-Codec nicht gefunden" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    AVCodecContext* outputCodecContext = avcodec_alloc_context3(outputCodec);&#xA;    outputCodecContext->bit_rate = bitRate;&#xA;    outputCodecContext->width = inputCodecContext->width;&#xA;    outputCodecContext->height = inputCodecContext->height;&#xA;    outputCodecContext->pix_fmt = outputCodec->pix_fmts[0];&#xA;    outputCodecContext->time_base = inputCodecContext->time_base;&#xA;&#xA;    int errorCode = avcodec_open2(outputCodecContext, outputCodec, NULL);&#xA;    if (errorCode != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim &#xD6;ffnen des Zielformat-Codecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    AVFormatContext* outputFormatContext = NULL;&#xA;    if (avformat_alloc_output_context2(&amp;outputFormatContext, NULL, NULL, outputFilename.c_str()) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim Erstellen des Ausgabe-Formats" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    AVStream* outputVideoStream = avformat_new_stream(outputFormatContext, outputCodec);&#xA;    if (outputVideoStream == NULL)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim Hinzuf&#xFC;gen des Video-Streams zum Ausgabe-Format" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;    outputVideoStream->id = outputFormatContext->nb_streams - 1;&#xA;    AVCodecParameters* outputCodecParameters = outputVideoStream->codecpar;&#xA;    if (avcodec_parameters_from_context(outputCodecParameters, outputCodecContext) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim Setzen des Ausgabe-Codecs" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    if (!(outputFormatContext->oformat->flags &amp; AVFMT_NOFILE))&#xA;    {&#xA;        if (avio_open(&amp;outputFormatContext->pb, outputFilename.c_str(), AVIO_FLAG_WRITE) != 0)&#xA;        {&#xA;            std::cout &lt;&lt; "Fehler beim &#xD6;ffnen der Ausgabedatei" &lt;&lt; std::endl;&#xA;            return -1;&#xA;        }&#xA;    }&#xA;&#xA;    if (avformat_write_header(outputFormatContext, NULL) != 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Fehler beim Schreiben des Ausgabe-Formats in die Ausgabedatei" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    AVPacket packet;&#xA;    int response;&#xA;    AVFrame* frame = av_frame_alloc();&#xA;    AVFrame* outputFrame = av_frame_alloc();&#xA;    while (av_read_frame(inputFormatContext, &amp;packet) == 0)&#xA;    {&#xA;        if (packet.stream_index == videoStreamIndex)&#xA;        {&#xA;            response = avcodec_send_packet(inputCodecContext, &amp;packet);&#xA;            while (response >= 0)&#xA;            {&#xA;                response = avcodec_receive_frame(inputCodecContext, frame);&#xA;                if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)&#xA;                {&#xA;                    break;&#xA;                }&#xA;                else if (response &lt; 0)&#xA;                {&#xA;                    std::cout &lt;&lt; "Fehler beim Dekodieren des Video-Pakets" &lt;&lt; std::endl;&#xA;                    return -1;&#xA;                }&#xA;&#xA;                struct SwsContext* swsContext = sws_getContext(inputCodecContext->width, inputCodecContext->height, inputCodecContext->pix_fmt, outputCodecContext->width, outputCodecContext->height, outputCodecContext->pix_fmt, SWS_BILINEAR, NULL, NULL, NULL); if (!swsContext)&#xA;                {&#xA;                    std::cout &lt;&lt; "Fehler beim Erstellen des SwsContext" &lt;&lt; std::endl;&#xA;                    return -1;&#xA;                }&#xA;                sws_scale(swsContext, frame->data, frame->linesize, 0, inputCodecContext->height, outputFrame->data, outputFrame->linesize);&#xA;                sws_freeContext(swsContext);&#xA;&#xA;                outputFrame->pts = frame->pts;&#xA;                outputFrame->pkt_dts = frame->pkt_dts;&#xA;                //outputFrame->pkt_duration = frame->pkt_duration;&#xA;                response = avcodec_send_frame(outputCodecContext, outputFrame);&#xA;                while (response >= 0)&#xA;                {&#xA;                    response = avcodec_receive_packet(outputCodecContext, &amp;packet);&#xA;                    if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)&#xA;                    {&#xA;                        break;&#xA;                    }&#xA;                    else if (response &lt; 0)&#xA;                    {&#xA;                        std::cout &lt;&lt; "Fehler beim Kodieren des Ausgabe-Frames" &lt;&lt; std::endl;&#xA;                        return -1;&#xA;                    }&#xA;&#xA;                    packet.stream_index = outputVideoStream->id;&#xA;                    av_packet_rescale_ts(&amp;packet, outputCodecContext->time_base, outputVideoStream->time_base);&#xA;                    if (av_interleaved_write_frame(outputFormatContext, &amp;packet) != 0)&#xA;                    {&#xA;                        std::cout &lt;&lt; "Fehler beim Schreiben des Ausgabe-Pakets" &lt;&lt; std::endl;&#xA;                        return -1;&#xA;                    }&#xA;                    av_packet_unref(&amp;packet);&#xA;                }&#xA;            }&#xA;        }&#xA;        av_packet_unref(&amp;packet);&#xA;    }&#xA;&#xA;    av_write_trailer(outputFormatContext);&#xA;    avcodec_free_context(&amp;inputCodecContext);&#xA;    avcodec_free_context(&amp;outputCodecContext);&#xA;    avformat_close_input(&amp;inputFormatContext);&#xA;    avformat_free_context(inputFormatContext);&#xA;    avformat_free_context(outputFormatContext);&#xA;    av_frame_free(&amp;frame);&#xA;    av_frame_free(&amp;outputFrame);&#xA;&#xA;    return 0;&#xA;&#xA;}&#xA;

    &#xA;