Recherche avancée

Médias (16)

Mot : - Tags -/mp3

Autres articles (39)

  • Submit enhancements and plugins

    13 avril 2011

    If you have developed a new extension to add one or more useful features to MediaSPIP, let us know and its integration into the core MedisSPIP functionality will be considered.
    You can use the development discussion list to request for help with creating a plugin. As MediaSPIP is based on SPIP - or you can use the SPIP discussion list SPIP-Zone.

  • Librairies et binaires spécifiques au traitement vidéo et sonore

    31 janvier 2010, par

    Les logiciels et librairies suivantes sont utilisées par SPIPmotion d’une manière ou d’une autre.
    Binaires obligatoires FFMpeg : encodeur principal, permet de transcoder presque tous les types de fichiers vidéo et sonores dans les formats lisibles sur Internet. CF ce tutoriel pour son installation ; Oggz-tools : outils d’inspection de fichiers ogg ; Mediainfo : récupération d’informations depuis la plupart des formats vidéos et sonores ;
    Binaires complémentaires et facultatifs flvtool2 : (...)

  • 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 (4598)

  • Vulkan image data to AVFrames and to video

    12 avril 2024, par W4zab1

    I am trying to encode Vulkan image data into video with MPEG4 format. For some reason the output videofile is corrupted. FFProbe shows discontinuity in timestamps, and the frames are corrupted.
First I prepare my video encoder
    
Then I get FrameEnded events from my engine where I can get the image data from the vulkan swapchain.
    
I then convert the image data from vulkan to AVFrames (RGBA to YUV420P), then I pass the frames into queue.
    
This queue is then handled in another thread, where the frames are processed, and written into video.
    
I am bit of a noob with ffmpeg, so there can be some code that does not make sense.

    


    This seems right straight forward logic, but there is probably some problems with codec params, way I am converting the imagedata to AVFrame, or something of that sort.
    
The videofile still gets created, and has some data in it (it is > 0 bytes, and longer the recording, bigger the filesize).
    
There is no errors from ffmpeg with log_level set to DEBUG.

    


    struct FrameData {&#xA;    AVFrame* frame;&#xA;    int frame_index;&#xA;};&#xA;&#xA;class EventListenerVideoCapture : public VEEventListenerGLFW {&#xA;private:&#xA;    AVFormatContext* format_ctx = nullptr;&#xA;    AVCodec* video_codec = nullptr;&#xA;    AVCodecContext* codec_context = nullptr;&#xA;    AVStream* video_stream = nullptr;&#xA;    AVDictionary* muxer_opts = nullptr;&#xA;    int frame_index = 0;&#xA;&#xA;    std::queue frame_queue;&#xA;    std::mutex queue_mtx;&#xA;    std::condition_variable queue_cv;&#xA;    std::atomic<bool> stop_processing{ false };&#xA;    std::thread video_processing_thread;&#xA;    int prepare_video_encoder()&#xA;    {&#xA;        av_log_set_level(AV_LOG_DEBUG);&#xA;        // Add video stream to format context&#xA;        avformat_alloc_output_context2(&amp;format_ctx, nullptr, nullptr, "video.mpg");&#xA;        video_stream = avformat_new_stream(format_ctx, NULL);&#xA;        video_codec = (AVCodec*)avcodec_find_encoder(AV_CODEC_ID_MPEG4);&#xA;        codec_context = avcodec_alloc_context3(video_codec);&#xA;        if (!format_ctx) { std::cerr &lt;&lt; "Error: Failed to allocate format context" &lt;&lt; std::endl; system("pause"); }&#xA;        if (!video_stream) { std::cerr &lt;&lt; "Error: Failed to create new stream" &lt;&lt; std::endl; system("pause"); }&#xA;        if (!video_codec) { std::cerr &lt;&lt; "Error: Failed to find video codec" &lt;&lt; std::endl; system("pause"); }&#xA;        if (!codec_context) { std::cerr &lt;&lt; "Error: Failed to allocate codec context" &lt;&lt; std::endl; system("pause"); }&#xA;&#xA;        if (avio_open(&amp;format_ctx->pb, "video.mpg", AVIO_FLAG_WRITE) &lt; 0) { std::cerr &lt;&lt; "Error: Failed to open file for writing!" &lt;&lt; std::endl; return -1; }&#xA;&#xA;        av_opt_set(codec_context->priv_data, "preset", "fast", 0);&#xA;&#xA;        codec_context->codec_id = AV_CODEC_ID_MPEG4;&#xA;        codec_context->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;        codec_context->pix_fmt = AV_PIX_FMT_YUV420P;&#xA;        codec_context->width = getWindowPointer()->getExtent().width;&#xA;        codec_context->height = getWindowPointer()->getExtent().height;&#xA;        codec_context->bit_rate = 1000 * 1000; // Bitrate&#xA;        codec_context->time_base = { 1, 30 }; // 30 FPS&#xA;        codec_context->gop_size = 10;&#xA;&#xA;        av_dict_set(&amp;muxer_opts, "movflags", "faststart", 0);&#xA;&#xA;        //Unecessary? Since the params are copied anyways&#xA;        video_stream->time_base = codec_context->time_base;&#xA;&#xA;        //Try to open codec after changes&#xA;        //copy codec_context params to videostream&#xA;        //and write headers to format_context&#xA;        if (avcodec_open2(codec_context, video_codec, NULL) &lt; 0) { std::cerr &lt;&lt; "Error: Could not open codec!" &lt;&lt; std::endl; return -1; }&#xA;        if (avcodec_parameters_from_context(video_stream->codecpar, codec_context) &lt; 0) { std::cerr &lt;&lt; "Error: Could not copy params from context to stream!" &lt;&lt; std::endl; return -1; };&#xA;        if (avformat_write_header(format_ctx, &amp;muxer_opts) &lt; 0) { std::cerr &lt;&lt; "Error: Failed to write output file headers!" &lt;&lt; std::endl; return -1; }&#xA;        return 0;&#xA;    }&#xA;&#xA;    void processFrames() {&#xA;        while (!stop_processing) {&#xA;            FrameData* frameData = nullptr;&#xA;            {&#xA;                std::unique_lock lock(queue_mtx);&#xA;                queue_cv.wait(lock, [&amp;]() { return !frame_queue.empty() || stop_processing; });&#xA;&#xA;                if (stop_processing &amp;&amp; frame_queue.empty())&#xA;                    break;&#xA;&#xA;                frameData = frame_queue.front();&#xA;                frame_queue.pop();&#xA;            }&#xA;&#xA;            if (frameData) {&#xA;                encodeAndWriteFrame(frameData);&#xA;                AVFrame* frame = frameData->frame;&#xA;                av_frame_free(&amp;frame); // Free the processed frame&#xA;                delete frameData;&#xA;            }&#xA;        }&#xA;    }&#xA;&#xA;    void encodeAndWriteFrame(FrameData* frameData) {&#xA;&#xA;        // Validation&#xA;        if (!frameData->frame) { std::cerr &lt;&lt; "Error: Frame was null! " &lt;&lt; std::endl; return; }&#xA;        if (frameData->frame->format != codec_context->pix_fmt) { std::cerr &lt;&lt; "Error: Frame format mismatch!" &lt;&lt; std::endl; return; }&#xA;        if ( av_frame_get_buffer(frameData->frame, 0) &lt; 0) { std::cerr &lt;&lt; "Error allocating frame buffer: " &lt;&lt; std::endl; return; }&#xA;        if (!codec_context) return;&#xA;&#xA;        AVPacket* pkt = av_packet_alloc();&#xA;        if (!pkt) { std::cerr &lt;&lt; "Error: Failed to allocate AVPacket" &lt;&lt; std::endl; system("pause"); }&#xA;&#xA;        int ret = avcodec_send_frame(codec_context, frameData->frame);&#xA;        if (ret &lt; 0) { &#xA;            std::cerr &lt;&lt; "Error receiving packet from codec: " &lt;&lt; ret &lt;&lt; std::endl;&#xA;            delete frameData;&#xA;            av_packet_free(&amp;pkt); return; &#xA;        }&#xA;&#xA;        while (ret >= 0) {&#xA;            ret = avcodec_receive_packet(codec_context, pkt);&#xA;&#xA;            //Error checks&#xA;            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { break; }&#xA;            else if (ret &lt; 0) { std::cerr &lt;&lt; "Error receiving packet from codec: " &lt;&lt; ret &lt;&lt; std::endl; av_packet_free(&amp;pkt); return; }&#xA;            if (!video_stream) { std::cerr &lt;&lt; "Error: video stream is null!" &lt;&lt; std::endl; av_packet_free(&amp;pkt); return; }&#xA;            &#xA;            int64_t frame_duration = codec_context->time_base.den / codec_context->time_base.num;&#xA;            pkt->stream_index = video_stream->index;&#xA;            pkt->duration = frame_duration;&#xA;            pkt->pts = frameData->frame_index * frame_duration;&#xA;&#xA;            int write_ret = av_interleaved_write_frame(format_ctx, pkt);&#xA;            if (write_ret &lt; 0) { std::cerr &lt;&lt; "Error: failed to write a frame! " &lt;&lt; write_ret &lt;&lt; std::endl;}&#xA;&#xA;            av_packet_unref(pkt);&#xA;        }&#xA;&#xA;        av_packet_free(&amp;pkt);&#xA;&#xA;    }&#xA;&#xA;protected:&#xA;    virtual void onFrameEnded(veEvent event) override {&#xA;        // Get the image data from vulkan&#xA;        VkExtent2D extent = getWindowPointer()->getExtent();&#xA;        uint32_t imageSize = extent.width * extent.height * 4;&#xA;        VkImage image = getEnginePointer()->getRenderer()->getSwapChainImage();&#xA;&#xA;        uint8_t *dataImage = new uint8_t[imageSize];&#xA;        &#xA;        vh::vhBufCopySwapChainImageToHost(getEnginePointer()->getRenderer()->getDevice(),&#xA;            getEnginePointer()->getRenderer()->getVmaAllocator(),&#xA;            getEnginePointer()->getRenderer()->getGraphicsQueue(),&#xA;            getEnginePointer()->getRenderer()->getCommandPool(),&#xA;            image, VK_FORMAT_R8G8B8A8_UNORM,&#xA;            VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,&#xA;            dataImage, extent.width, extent.height, imageSize);&#xA;        &#xA;        // Create AVFrame for the converted image data&#xA;        AVFrame* frame = av_frame_alloc();&#xA;        if (!frame) { std::cout &lt;&lt; "Could not allocate memory for frame!" &lt;&lt; std::endl; return; }&#xA;&#xA;        frame->format = AV_PIX_FMT_YUV420P;&#xA;        frame->width = extent.width;&#xA;        frame->height = extent.height;&#xA;        if (av_frame_get_buffer(frame, 0) &lt; 0) { std::cerr &lt;&lt; "Failed to allocate frame buffer! " &lt;&lt; std::endl; return;} ;&#xA;&#xA;        // Prepare context for converting from RGBA to YUV420P&#xA;        SwsContext* sws_ctx = sws_getContext(&#xA;            extent.width, extent.height, AV_PIX_FMT_RGBA,&#xA;            extent.width, extent.height, AV_PIX_FMT_YUV420P,&#xA;            SWS_BILINEAR, nullptr, nullptr, nullptr);&#xA;&#xA;        // Convert the vulkan image data to AVFrame&#xA;        uint8_t* src_data[1] = { dataImage };&#xA;        int src_linesize[1] = { extent.width * 4 };&#xA;        int scale_ret = sws_scale(sws_ctx, src_data, src_linesize, 0, extent.height,&#xA;                  frame->data, frame->linesize);&#xA;&#xA;        if (scale_ret &lt;= 0) { std::cerr &lt;&lt; "Failed to scale the image to frame" &lt;&lt; std::endl; return; }&#xA;&#xA;        sws_freeContext(sws_ctx);&#xA;        delete[] dataImage;&#xA;&#xA;        // Add frame to the queue&#xA;        {&#xA;            std::lock_guard lock(queue_mtx);&#xA;&#xA;            FrameData* frameData = new FrameData;&#xA;            frameData->frame = frame;&#xA;            frameData->frame_index = frame_index;&#xA;            frame_queue.push(frameData);&#xA;&#xA;            frame_index&#x2B;&#x2B;;&#xA;        }&#xA;&#xA;        // Notify processing thread&#xA;        queue_cv.notify_one();&#xA;    }&#xA;&#xA;public:&#xA;    EventListenerVideoCapture(std::string name) : VEEventListenerGLFW(name) {&#xA;        //Prepare the video encoder&#xA;        int ret = prepare_video_encoder();&#xA;        if (ret &lt; 0)&#xA;        {&#xA;            std::cerr &lt;&lt; "Failed to prepare video encoder! " &lt;&lt; std::endl;&#xA;            exit(-1);&#xA;        }&#xA;        else&#xA;        {&#xA;            // Start video processing thread&#xA;            video_processing_thread = std::thread(&amp;EventListenerVideoCapture::processFrames, this);&#xA;        }&#xA;    }&#xA;&#xA;    ~EventListenerVideoCapture() {&#xA;        // Stop video processing thread&#xA;        stop_processing = true;&#xA;        queue_cv.notify_one(); // Notify processing thread to stop&#xA;&#xA;        if (video_processing_thread.joinable()) {&#xA;            video_processing_thread.join();&#xA;        }&#xA;&#xA;        // Flush codec and close output file&#xA;        avcodec_send_frame(codec_context, nullptr);&#xA;        av_write_trailer(format_ctx);&#xA;&#xA;        av_dict_free(&amp;muxer_opts);&#xA;        avio_closep(&amp;format_ctx->pb);&#xA;        avcodec_free_context(&amp;codec_context);&#xA;        avformat_free_context(format_ctx);&#xA;    }&#xA;};&#xA;&#xA;</bool>

    &#xA;

    I have tried changing the codec params, debugging and printing the videoframe data with no success.

    &#xA;

  • avformat/wavdec : use ff_pcm_default_packet_size for the default packet size

    7 mars 2024, par Marton Balint
    avformat/wavdec : use ff_pcm_default_packet_size for the default packet size
    

    Signed-off-by : Marton Balint <cus@passwd.hu>

    • [DH] libavformat/wavdec.c
    • [DH] tests/ref/fate/dcinema-encode
    • [DH] tests/ref/fate/filter-chorus
    • [DH] tests/ref/fate/flcl1905
    • [DH] tests/ref/fate/g722-encode
    • [DH] tests/ref/fate/g726-encode-2bit
    • [DH] tests/ref/fate/g726-encode-3bit
    • [DH] tests/ref/fate/g726-encode-4bit
    • [DH] tests/ref/fate/g726-encode-5bit
    • [DH] tests/ref/fate/matroska-move-cues-to-front
    • [DH] tests/ref/seek/acodec-adpcm-ima_wav
    • [DH] tests/ref/seek/acodec-adpcm-ima_wav-trellis
    • [DH] tests/ref/seek/acodec-adpcm-ms
    • [DH] tests/ref/seek/acodec-adpcm-ms-trellis
    • [DH] tests/ref/seek/acodec-adpcm-yamaha
    • [DH] tests/ref/seek/acodec-adpcm-yamaha-trellis
  • avformat/pcm : decrease target audio frame per sec to 10

    3 mars 2024, par Marton Balint
    avformat/pcm : decrease target audio frame per sec to 10
    

    This makes the wav and pcm demuxer demux bigger packets, which is more
    efficient.

    As a side effect of the bigger packets, audio durations can become less exact
    for command lines such as "ffmpeg -i $INPUT -c:a copy -t 1.0 $OUTPUT".

    Signed-off-by : Marton Balint <cus@passwd.hu>

    • [DH] libavformat/pcm.c
    • [DH] tests/ref/acodec/pcm-s16be
    • [DH] tests/ref/acodec/pcm-s16be_planar
    • [DH] tests/ref/acodec/pcm-s16le_planar
    • [DH] tests/ref/acodec/pcm-s24be
    • [DH] tests/ref/acodec/pcm-s24le_planar
    • [DH] tests/ref/acodec/pcm-s32be
    • [DH] tests/ref/acodec/pcm-s32le_planar
    • [DH] tests/ref/acodec/pcm-s8_planar
    • [DH] tests/ref/acodec/pcm-u16be
    • [DH] tests/ref/acodec/pcm-u16le
    • [DH] tests/ref/acodec/pcm-u24be
    • [DH] tests/ref/acodec/pcm-u24le
    • [DH] tests/ref/acodec/pcm-u32be
    • [DH] tests/ref/acodec/pcm-u32le
    • [DH] tests/ref/acodec/s302m
    • [DH] tests/ref/fate/dcinema-encode
    • [DH] tests/ref/fate/filter-acrossfade
    • [DH] tests/ref/fate/filter-adelay
    • [DH] tests/ref/fate/filter-aecho
    • [DH] tests/ref/fate/filter-aemphasis-50fm
    • [DH] tests/ref/fate/filter-aemphasis-75kf
    • [DH] tests/ref/fate/filter-afade-esin
    • [DH] tests/ref/fate/filter-afade-exp
    • [DH] tests/ref/fate/filter-afade-hsin
    • [DH] tests/ref/fate/filter-afade-iqsin
    • [DH] tests/ref/fate/filter-afade-log
    • [DH] tests/ref/fate/filter-afade-qsin
    • [DH] tests/ref/fate/filter-agate
    • [DH] tests/ref/fate/filter-alimiter
    • [DH] tests/ref/fate/filter-amerge
    • [DH] tests/ref/fate/filter-anequalizer
    • [DH] tests/ref/fate/filter-apad
    • [DH] tests/ref/fate/filter-asegment-samples-absolute
    • [DH] tests/ref/fate/filter-asegment-samples-relative
    • [DH] tests/ref/fate/filter-asegment-timestamps-absolute
    • [DH] tests/ref/fate/filter-asegment-timestamps-relative
    • [DH] tests/ref/fate/filter-asetrate
    • [DH] tests/ref/fate/filter-atrim-mixed
    • [DH] tests/ref/fate/filter-atrim-time
    • [DH] tests/ref/fate/filter-chorus
    • [DH] tests/ref/fate/filter-compand
    • [DH] tests/ref/fate/filter-crystalizer
    • [DH] tests/ref/fate/filter-dcshift
    • [DH] tests/ref/fate/filter-earwax
    • [DH] tests/ref/fate/filter-extrastereo
    • [DH] tests/ref/fate/filter-pan-downmix1
    • [DH] tests/ref/fate/filter-pan-downmix2
    • [DH] tests/ref/fate/filter-pan-mono1
    • [DH] tests/ref/fate/filter-pan-mono2
    • [DH] tests/ref/fate/filter-pan-stereo1
    • [DH] tests/ref/fate/filter-pan-stereo2
    • [DH] tests/ref/fate/filter-pan-stereo3
    • [DH] tests/ref/fate/filter-pan-stereo4
    • [DH] tests/ref/fate/filter-pan-upmix1
    • [DH] tests/ref/fate/filter-pan-upmix2
    • [DH] tests/ref/fate/filter-stereotools
    • [DH] tests/ref/fate/flcl1905
    • [DH] tests/ref/fate/g722-encode
    • [DH] tests/ref/fate/g726-encode-2bit
    • [DH] tests/ref/fate/g726-encode-3bit
    • [DH] tests/ref/fate/g726-encode-4bit
    • [DH] tests/ref/fate/g726-encode-5bit
    • [DH] tests/ref/fate/matroska-move-cues-to-front
    • [DH] tests/ref/fate/mov-channel-description
    • [DH] tests/ref/fate/mov-mp4-pcm
    • [DH] tests/ref/fate/mov-mp4-pcm-float
    • [DH] tests/ref/lavf/ast
    • [DH] tests/ref/lavf/mov
    • [DH] tests/ref/lavf/mov_rtphint
    • [DH] tests/ref/lavf/s16.voc
    • [DH] tests/ref/lavf/smjpeg
    • [DH] tests/ref/lavf/voc
    • [DH] tests/ref/seek/acodec-adpcm-ima_wav
    • [DH] tests/ref/seek/acodec-adpcm-ima_wav-trellis
    • [DH] tests/ref/seek/acodec-adpcm-ms
    • [DH] tests/ref/seek/acodec-adpcm-ms-trellis
    • [DH] tests/ref/seek/acodec-adpcm-yamaha
    • [DH] tests/ref/seek/acodec-adpcm-yamaha-trellis
    • [DH] tests/ref/seek/acodec-pcm-alaw
    • [DH] tests/ref/seek/acodec-pcm-f32be
    • [DH] tests/ref/seek/acodec-pcm-f32le
    • [DH] tests/ref/seek/acodec-pcm-f64be
    • [DH] tests/ref/seek/acodec-pcm-f64le
    • [DH] tests/ref/seek/acodec-pcm-mulaw
    • [DH] tests/ref/seek/acodec-pcm-s16le
    • [DH] tests/ref/seek/acodec-pcm-s24le
    • [DH] tests/ref/seek/acodec-pcm-s32le
    • [DH] tests/ref/seek/acodec-pcm-u8
    • [DH] tests/ref/seek/lavf-al
    • [DH] tests/ref/seek/lavf-au
    • [DH] tests/ref/seek/lavf-mov
    • [DH] tests/ref/seek/lavf-ul
    • [DH] tests/ref/seek/lavf-voc
    • [DH] tests/ref/seek/lavf-wav