Recherche avancée

Médias (0)

Mot : - Tags -/publication

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (71)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

  • Configurer la prise en compte des langues

    15 novembre 2010, par

    Accéder à la configuration et ajouter des langues prises en compte
    Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
    De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
    Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...)

Sur d’autres sites (7065)

  • File encoded as FFV1 with libavcodec is unplayable

    19 novembre 2016, par Ali Alidoust

    I’m using the following code to encode a series of frames into an mkv or avi file with FFV1 encoding :

    HRESULT Session::createContext(LPCSTR filepath, UINT width, UINT height, UINT fps_num, UINT fps_den) {
       LOG(filepath);

       this->codec = avcodec_find_encoder(AV_CODEC_ID_FFV1);
       RET_IF_NULL(this->codec, "Could not create codec", E_FAIL);

       this->oformat = av_guess_format(NULL, filepath, NULL);
       RET_IF_NULL(this->oformat, "Could not create format", E_FAIL);
       this->oformat->video_codec = AV_CODEC_ID_FFV1;
       this->width = width;
       this->height = height;
       this->context = avcodec_alloc_context3(this->codec);
       RET_IF_NULL(this->context, "Could not allocate context for the codec", E_FAIL);

       this->context->codec = this->codec;
       this->context->codec_id = AV_CODEC_ID_FFV1;
       this->context->codec_type = AVMEDIA_TYPE_VIDEO;

       this->context->pix_fmt = AV_PIX_FMT_YUV420P;
       this->context->width = this->width;
       this->context->height = this->height;
       this->context->time_base.num = fps_den;
       this->context->time_base.den = fps_num;

       this->context->gop_size = 1;

       av_opt_set_int(this->context->priv_data, "coder", 0, 0);
       av_opt_set_int(this->context->priv_data, "context", 1, 0);
       av_opt_set_int(this->context->priv_data, "slicecrc", 1, 0);

       avformat_alloc_output_context2(&fmtContext, NULL, NULL, filepath);

       this->fmtContext->oformat = this->oformat;
       this->fmtContext->video_codec_id = AV_CODEC_ID_FFV1;

       this->stream = avformat_new_stream(this->fmtContext, this->codec);
       RET_IF_NULL(this->fmtContext, "Could not create new stream", E_FAIL);
       avcodec_parameters_from_context(this->stream->codecpar, this->context);
       this->stream->codecpar->level = 3;

       /*if (this->fmtContext->oformat->flags & AVFMT_GLOBALHEADER)
       {*/
           this->context->flags |= CODEC_FLAG_GLOBAL_HEADER;
       /*}*/

       RET_IF_FAILED_AV(avcodec_open2(this->context, this->codec, NULL), "Could not open codec", E_FAIL);
       RET_IF_FAILED_AV(avio_open(&this->fmtContext->pb, filepath, AVIO_FLAG_READ_WRITE), "Could not open output file", E_FAIL);
       RET_IF_NULL(this->fmtContext->pb, "Could not open output file", E_FAIL);
       RET_IF_FAILED_AV(avformat_write_header(this->fmtContext, NULL), "Could not write header", E_FAIL);

       frame = av_frame_alloc();
       RET_IF_NULL(frame, "Could not allocate frame", E_FAIL);
       frame->format = this->context->pix_fmt;
       frame->width = width;
       frame->height = height;
       // RET_IF_FAILED(av_image_alloc(frame->data, frame->linesize, context->width, context->height, context->pix_fmt, 32), "Could not allocate image", E_FAIL);
       return S_OK;
    }

    HRESULT Session::writeFrame(IMFSample * pSample) {
       IMFMediaBuffer *mediaBuffer = NULL;
       BYTE *pData = NULL;
       DWORD length;

       RET_IF_FAILED(pSample->ConvertToContiguousBuffer(&mediaBuffer), "Could not convert IMFSample to contagiuous buffer", E_FAIL);
       RET_IF_FAILED(mediaBuffer->GetCurrentLength(&length), "Could not get buffer length", E_FAIL);
       RET_IF_FAILED(mediaBuffer->Lock(&pData, NULL, NULL), "Could not lock the buffer", E_FAIL);
       RET_IF_FAILED(av_image_fill_arrays(frame->data, frame->linesize, pData, AV_PIX_FMT_YUV420P, this->width, this->height, 1), "Could not fill the frame with data from the buffer", E_FAIL);
       LOG_IF_FAILED(mediaBuffer->Unlock(), "Could not unlock the buffer");

       frame->pts = this->pts++;

       AVPacket pkt;

       av_init_packet(&pkt);
       pkt.data = NULL;
       pkt.size = 0;

       RET_IF_FAILED_AV(avcodec_send_frame(this->context, frame), "Could not send the frame to the encoder", E_FAIL);
       if (SUCCEEDED(avcodec_receive_packet(this->context, &pkt))) {
           RET_IF_FAILED_AV(av_interleaved_write_frame(this->fmtContext, &pkt), "Could not write the received packet.", E_FAIL);
       }

       av_packet_unref(&pkt);

       return S_OK;
    }

    HRESULT Session::endSession() {
       LOG("Ending session...");
       LOG("Closing files...");
       av_write_trailer(this->fmtContext);
       avio_close(this->fmtContext->pb);
       avcodec_close(this->context);
       av_free(this->context);
       //fclose(this->file);
       LOG("Done.");
       return S_OK;
    }

    The problem is that the generated file is not playable in either VLC or MPC-HC. However, MPC-HC reports following info in file properties :

    General
    Unique ID                      : 202978442142665779317960161865934977227 (0x98B439D9BE859109BD5EC00A62A238CB)
    Complete name                  : T:\Test.mkv
    Format                         : Matroska
    Format version                 : Version 4 / Version 2
    File size                      : 24.6 MiB
    Duration                       : 147ms
    Overall bit rate               : 1 401 Mbps
    Writing application            : Lavf57.57.100
    Writing library                : Lavf57.57.100

    Video
    ID                             : 1
    Format                         : FFV1
    Format version                 : Version 0
    Codec ID                       : V_MS/VFW/FOURCC / FFV1
    Duration                       : 147ms
    Width                          : 1 280 pixels
    Height                         : 720 pixels
    Display aspect ratio           : 16:9
    Frame rate mode                : Constant
    Frame rate                     : 1 000.000 fps
    Color space                    : YUV
    Chroma subsampling             : 4:2:0
    Bit depth                      : 8 bits
    Compression mode               : Lossless
    Default                        : Yes
    Forced                         : No
    DURATION                       : 00:00:00.147000000
    coder_type                     : Golomb Rice

    Something to note is that it reports 1000 FPS which is weird since I’ve set AVCodecContext::time_base in the code.

    UPDATE :

    I managed to set the correct fps by setting time_base property of the stream :

    this->stream->time_base.den = fps_num;
    this->stream->time_base.num = fps_den;

    VLC plays the output file but it shows VLC logo instead of the video, as if there is no video stream in the file.

  • What's wrong with how I save a vector of AVFrames as mp4 video using the h264 encoder ?

    8 avril 2023, par nokla

    I am trying to encode a vector of AVFrames to an MP4 file using the h264 codec.

    


    The code runs without errors but both when I try to open the saved video file with the windows media and adobe Media Encoded they it says that it is in an unsupported format.

    


    I went through it with a debugger and everything seemed to work fine.

    



    


    This is the function I used to saved the video :

    


    void SaveVideo(std::string&amp; output_filename, std::vector<avframe> video)&#xA;{&#xA;    // Initialize FFmpeg&#xA;    avformat_network_init();&#xA;&#xA;    // Open the output file context&#xA;    AVFormatContext* format_ctx = nullptr;&#xA;    int ret = avformat_alloc_output_context2(&amp;format_ctx, nullptr, nullptr, output_filename.c_str());&#xA;    if (ret &lt; 0) {&#xA;        wxMessageBox("Error creating output context: ");&#xA;        wxMessageBox(av_err2str(ret));&#xA;        return;&#xA;    }&#xA;&#xA;    // Open the output file&#xA;    ret = avio_open(&amp;format_ctx->pb, output_filename.c_str(), AVIO_FLAG_WRITE);&#xA;    if (ret &lt; 0) {&#xA;        std::cerr &lt;&lt; "Error opening output file: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Create the video stream&#xA;    const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);&#xA;    if (!codec) {&#xA;        std::cerr &lt;&lt; "Error finding H.264 encoder" &lt;&lt; std::endl;&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    AVStream* stream = avformat_new_stream(format_ctx, codec);&#xA;    if (!stream) {&#xA;        std::cerr &lt;&lt; "Error creating output stream" &lt;&lt; std::endl;&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Set the stream parameters&#xA;    stream->codecpar->codec_id = AV_CODEC_ID_H264;&#xA;    stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;    stream->codecpar->width =video.front().width;&#xA;    stream->codecpar->height = video.front().height;&#xA;    stream->codecpar->format = AV_PIX_FMT_YUV420P;&#xA;    stream->codecpar->bit_rate = 400000;&#xA;    AVRational framerate = { 1, 30};&#xA;    stream->time_base = av_inv_q(framerate);&#xA;&#xA;    // Open the codec context&#xA;    AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);&#xA;    codec_ctx->codec_tag = 0;&#xA;    codec_ctx->time_base = stream->time_base;&#xA;    codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;&#xA;    if (!codec_ctx) {&#xA;        std::cout &lt;&lt; "Error allocating codec context" &lt;&lt; std::endl;&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    ret = avcodec_parameters_to_context(codec_ctx, stream->codecpar);&#xA;    if (ret &lt; 0) {&#xA;        std::cout &lt;&lt; "Error setting codec context parameters: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;    AVDictionary* opt = NULL;&#xA;    ret = avcodec_open2(codec_ctx, codec, &amp;opt);&#xA;    if (ret &lt; 0) {&#xA;        wxMessageBox("Error opening codec: ");&#xA;        wxMessageBox(av_err2str(ret));&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Allocate a buffer for the frame data&#xA;    AVFrame* frame = av_frame_alloc();&#xA;    if (!frame) {&#xA;        std::cerr &lt;&lt; "Error allocating frame" &lt;&lt; std::endl;&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    frame->format = codec_ctx->pix_fmt;&#xA;    frame->width = codec_ctx->width;&#xA;    frame->height = codec_ctx->height;&#xA;&#xA;    ret = av_frame_get_buffer(frame, 0);&#xA;    if (ret &lt; 0) {&#xA;        std::cerr &lt;&lt; "Error allocating frame buffer: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;        av_frame_free(&amp;frame);&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Allocate a buffer for the converted frame data&#xA;    AVFrame* converted_frame = av_frame_alloc();&#xA;    if (!converted_frame) {&#xA;        std::cerr &lt;&lt; "Error allocating converted frame" &lt;&lt; std::endl;&#xA;        av_frame_free(&amp;frame);&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    converted_frame->format = AV_PIX_FMT_YUV420P;&#xA;    converted_frame->width = codec_ctx->width;&#xA;    converted_frame->height = codec_ctx->height;&#xA;&#xA;    ret = av_frame_get_buffer(converted_frame, 0);&#xA;    if (ret &lt; 0) {&#xA;        std::cerr &lt;&lt; "Error allocating converted frame buffer: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;        av_frame_free(&amp;frame);&#xA;        av_frame_free(&amp;converted_frame);&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Initialize the converter&#xA;    SwsContext* converter = sws_getContext(&#xA;        codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt,&#xA;        codec_ctx->width, codec_ctx->height, AV_PIX_FMT_YUV420P,&#xA;        SWS_BICUBIC, nullptr, nullptr, nullptr&#xA;    );&#xA;    if (!converter) {&#xA;        std::cerr &lt;&lt; "Error initializing converter" &lt;&lt; std::endl;&#xA;        av_frame_free(&amp;frame);&#xA;        av_frame_free(&amp;converted_frame);&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Write the header to the output file&#xA;    ret = avformat_write_header(format_ctx, nullptr);&#xA;    if (ret &lt; 0) {&#xA;        std::cerr &lt;&lt; "Error writing header to output file: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;        av_frame_free(&amp;frame);&#xA;        av_frame_free(&amp;converted_frame);&#xA;        sws_freeContext(converter);&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Iterate over the frames and write them to the output file&#xA;    int frame_count = 0;&#xA;    for (auto&amp; frame: video) {&#xA;         {&#xA;            // Convert the frame to the output format&#xA;            sws_scale(converter,&#xA;                srcFrame.data, srcFrame.linesize, 0, srcFrame.height,&#xA;                converted_frame->data, converted_frame->linesize&#xA;            );&#xA;&#xA;            // Set the frame properties&#xA;            converted_frame->pts = av_rescale_q(frame_count, stream->time_base, codec_ctx->time_base);&#xA;            frame_count&#x2B;&#x2B;;&#xA;            //converted_frame->time_base.den = codec_ctx->time_base.den;&#xA;            //converted_frame->time_base.num = codec_ctx->time_base.num;&#xA;            // Encode the frame and write it to the output&#xA;            ret = avcodec_send_frame(codec_ctx, converted_frame);&#xA;            if (ret &lt; 0) {&#xA;                std::cerr &lt;&lt; "Error sending frame for encoding: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;                av_frame_free(&amp;frame);&#xA;                av_frame_free(&amp;converted_frame);&#xA;                sws_freeContext(converter);&#xA;                avcodec_free_context(&amp;codec_ctx);&#xA;                avformat_free_context(format_ctx);&#xA;                return;&#xA;            }&#xA;            AVPacket* pkt = av_packet_alloc();&#xA;            if (!pkt) {&#xA;                std::cerr &lt;&lt; "Error allocating packet" &lt;&lt; std::endl;&#xA;                return;&#xA;            }&#xA;            while (ret >= 0) {&#xA;                ret = avcodec_receive_packet(codec_ctx, pkt);&#xA;                if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {&#xA;                    std::string a = av_err2str(ret);&#xA;                    break;&#xA;                }&#xA;                else if (ret &lt; 0) {&#xA;                    wxMessageBox("Error during encoding");&#xA;                    wxMessageBox(av_err2str(ret));&#xA;                    av_packet_unref(pkt);&#xA;                    av_frame_free(&amp;frame);&#xA;                    av_frame_free(&amp;converted_frame);&#xA;                    sws_freeContext(converter);&#xA;                    avcodec_free_context(&amp;codec_ctx);&#xA;                    avformat_free_context(format_ctx);&#xA;                    return;&#xA;                }&#xA;&#xA;                // Write the packet to the output file&#xA;                av_packet_rescale_ts(pkt, codec_ctx->time_base, stream->time_base);&#xA;                pkt->stream_index = stream->index;&#xA;                ret = av_interleaved_write_frame(format_ctx, pkt);&#xA;                av_packet_unref(pkt);&#xA;                if (ret &lt; 0) {&#xA;                    std::cerr &lt;&lt; "Error writing packet to output file: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;                    av_frame_free(&amp;frame);&#xA;                    av_frame_free(&amp;converted_frame);&#xA;                    sws_freeContext(converter);&#xA;                    avcodec_free_context(&amp;codec_ctx);&#xA;                    avformat_free_context(format_ctx);&#xA;                    return;&#xA;                }&#xA;            }&#xA;        }&#xA;    }&#xA;&#xA;    // Flush the encoder&#xA;    ret = avcodec_send_frame(codec_ctx, nullptr);&#xA;    if (ret &lt; 0) {&#xA;        std::cerr &lt;&lt; "Error flushing encoder: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;        av_frame_free(&amp;frame);&#xA;        av_frame_free(&amp;converted_frame);&#xA;        sws_freeContext(converter);&#xA;        avcodec_free_context(&amp;codec_ctx);&#xA;        avformat_free_context(format_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    while (ret >= 0) {&#xA;        AVPacket* pkt = av_packet_alloc();&#xA;        if (!pkt) {&#xA;            std::cerr &lt;&lt; "Error allocating packet" &lt;&lt; std::endl;&#xA;            return;&#xA;        }&#xA;        ret = avcodec_receive_packet(codec_ctx, pkt);&#xA;        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {&#xA;            wxMessageBox("Error recieving packet");&#xA;            wxMessageBox(av_err2str(ret));&#xA;            break;&#xA;        }&#xA;        else if (ret &lt; 0) {&#xA;            std::cerr &lt;&lt; "Error during encoding: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;            av_packet_unref(pkt);&#xA;            av_frame_free(&amp;frame);&#xA;            av_frame_free(&amp;converted_frame);&#xA;            sws_freeContext(converter);&#xA;            avcodec_free_context(&amp;codec_ctx);&#xA;            avformat_free_context(format_ctx);&#xA;            return;&#xA;        }&#xA;&#xA;        // Write the packet to the output file&#xA;        av_packet_rescale_ts(pkt, codec_ctx->time_base, stream->time_base);&#xA;        pkt->stream_index = stream->index;&#xA;        ret = av_interleaved_write_frame(format_ctx, pkt);&#xA;        av_packet_unref(pkt);&#xA;        if (ret &lt; 0) {&#xA;            std::cerr &lt;&lt; "Error writing packet to output file: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;            av_frame_free(&amp;frame);&#xA;            av_frame_free(&amp;converted_frame);&#xA;            sws_freeContext(converter);&#xA;            avcodec_free_context(&amp;codec_ctx);&#xA;            avformat_free_context(format_ctx);&#xA;            return;&#xA;        }&#xA;    }&#xA;&#xA;    // Write the trailer to the output file&#xA;    ret = av_write_trailer(format_ctx);&#xA;    if (ret &lt; 0) {&#xA;        std::cerr &lt;&lt; "Error writing trailer to output file: " &lt;&lt; av_err2str(ret) &lt;&lt; std::endl;&#xA;    }&#xA;&#xA;    // Free all resources&#xA;    av_frame_free(&amp;frame);&#xA;    av_frame_free(&amp;converted_frame);&#xA;    sws_freeContext(converter);&#xA;    avcodec_free_context(&amp;codec_ctx);&#xA;    avformat_free_context(format_ctx);&#xA;}&#xA;&#xA;</avframe>

    &#xA;

    ** I know it is not the prettiest way to write this code, I just wanted to try and do something like that.

    &#xA;

    ** This is an altered version of the function as the original one was inside class. I changed it so you could compile it, but it might has some errors if I forgot to change something

    &#xA;

    Any help would be appreciated.

    &#xA;

  • How to use Ffmpeg Concat

    7 novembre 2022, par SyndicatorBBB

    I'm trying to use ffmpeg-concat to concatenate two files together (the files are the same so they have exact same properties) and I get the following error message, any idea why ?

    &#xA;

    &#xA;