Recherche avancée

Médias (0)

Mot : - Tags -/organisation

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

Autres articles (89)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

  • Les vidéos

    21 avril 2011, par

    Comme les documents de type "audio", Mediaspip affiche dans la mesure du possible les vidéos grâce à la balise html5 .
    Un des inconvénients de cette balise est qu’elle n’est pas reconnue correctement par certains navigateurs (Internet Explorer pour ne pas le nommer) et que chaque navigateur ne gère en natif que certains formats de vidéos.
    Son avantage principal quant à lui est de bénéficier de la prise en charge native de vidéos dans les navigateur et donc de se passer de l’utilisation de Flash et (...)

Sur d’autres sites (12504)

  • FFMPEG Presentation Time Stamps (PTS) calculation in RTSP stream

    8 décembre 2020, par BadaBudaBudu

    Below please find en raw example of my code for your better understanding of what it does. Please note that this is an updated (removed deprecated methods, etc.) example code by myself from the official FFMPEG documentation complemented by my encoder.

    


    /// STD&#xA;#include <iostream>&#xA;#include <string>&#xA;&#xA;/// FFMPEG&#xA;extern "C"&#xA;{&#xA;    #include <libavformat></libavformat>avformat.h>&#xA;    #include <libswscale></libswscale>swscale.h>&#xA;    #include <libavutil></libavutil>imgutils.h>&#xA;}&#xA;&#xA;/// VideoLib&#xA;#include <tools></tools>multimediaprocessing.h>&#xA;#include &#xA;#include &#xA;#include <enums></enums>codec.h>&#xA;#include <enums></enums>pixelformat.h>&#xA;&#xA;/// OpenCV&#xA;#include <opencv2></opencv2>opencv.hpp>&#xA;&#xA;inline static const char *inputRtspAddress = "rtsp://192.168.0.186:8080/video/h264";&#xA;&#xA;int main()&#xA;{&#xA;    AVFormatContext* formatContext = nullptr;&#xA;&#xA;    AVStream* audioStream = nullptr;&#xA;    AVStream* videoStream = nullptr;&#xA;    AVCodec* audioCodec = nullptr;&#xA;    AVCodec* videoCodec = nullptr;&#xA;    AVCodecContext* audioCodecContext = nullptr;&#xA;    AVCodecContext* videoCodecContext = nullptr;&#xA;    vl::AudioSettings audioSettings;&#xA;    vl::VideoSettings videoSettings;&#xA;&#xA;    int audioIndex = -1;&#xA;    int videoIndex = -1;&#xA;&#xA;    SwsContext* swsContext = nullptr;&#xA;    std::vector frameBuffer;&#xA;    AVFrame* frame = av_frame_alloc();&#xA;    AVFrame* decoderFrame = av_frame_alloc();&#xA;&#xA;    AVPacket packet;&#xA;    cv::Mat mat;&#xA;&#xA;    vl::tools::MultimediaProcessing multimediaProcessing("rtsp://127.0.0.1:8080/stream", vl::configs::rtspStream, 0, vl::enums::EPixelFormat::ABGR);&#xA;&#xA;    // *** OPEN STREAM *** //&#xA;    if(avformat_open_input(&amp;formatContext, inputRtspAddress, nullptr, nullptr) &lt; 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Failed to open input." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    if(avformat_find_stream_info(formatContext, nullptr) &lt; 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Failed to find stream info." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    // *** FIND DECODER FOR BOTH AUDIO AND VIDEO STREAM *** //&#xA;    audioCodec = avcodec_find_decoder(AVCodecID::AV_CODEC_ID_AAC);&#xA;    videoCodec = avcodec_find_decoder(AVCodecID::AV_CODEC_ID_H264);&#xA;&#xA;    if(audioCodec == nullptr || videoCodec == nullptr)&#xA;    {&#xA;        std::cout &lt;&lt; "No AUDIO or VIDEO in stream." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    // *** FIND STREAM FOR BOTH AUDIO AND VIDEO STREAM *** //&#xA;&#xA;    audioIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &amp;audioCodec, 0);&#xA;    videoIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_VIDEO, -1, -1, &amp;videoCodec, 0);&#xA;&#xA;    if(audioIndex &lt; 0 || videoIndex &lt; 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Failed to find AUDIO or VIDEO stream." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    audioStream = formatContext->streams[audioIndex];&#xA;    videoStream = formatContext->streams[videoIndex];&#xA;&#xA;    // *** ALLOC CODEC CONTEXT FOR BOTH AUDIO AND VIDEO STREAM *** //&#xA;    audioCodecContext = avcodec_alloc_context3(audioCodec);&#xA;    videoCodecContext = avcodec_alloc_context3(videoCodec);&#xA;&#xA;    if(audioCodecContext == nullptr || videoCodecContext == nullptr)&#xA;    {&#xA;        std::cout &lt;&lt; "Can not allocate AUDIO or VIDEO context." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    if(avcodec_parameters_to_context(audioCodecContext, formatContext->streams[audioIndex]->codecpar) &lt; 0 || avcodec_parameters_to_context(videoCodecContext, formatContext->streams[videoIndex]->codecpar) &lt; 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Can not fill AUDIO or VIDEO codec context." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    if(avcodec_open2(audioCodecContext, audioCodec, nullptr) &lt; 0 || avcodec_open2(videoCodecContext, videoCodec, nullptr) &lt; 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Failed to open AUDIO codec" &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    // *** INITIALIZE MULTIMEDIA PROCESSING *** //&#xA;    std::vector<unsigned char="char"> extraData(audioStream->codecpar->extradata_size);&#xA;    std::copy_n(audioStream->codecpar->extradata, extraData.size(), extraData.begin());&#xA;&#xA;    audioSettings.sampleRate         = audioStream->codecpar->sample_rate,&#xA;    audioSettings.bitrate            = audioStream->codecpar->bit_rate,&#xA;    audioSettings.codec              = vl::enums::EAudioCodec::AAC,&#xA;    audioSettings.channels           = audioStream->codecpar->channels,&#xA;    audioSettings.bitsPerCodedSample = audioStream->codecpar->bits_per_coded_sample,&#xA;    audioSettings.bitsPerRawSample   = audioStream->codecpar->bits_per_raw_sample,&#xA;    audioSettings.blockAlign         = audioStream->codecpar->block_align,&#xA;    audioSettings.channelLayout      = audioStream->codecpar->channel_layout,&#xA;    audioSettings.format             = audioStream->codecpar->format,&#xA;    audioSettings.frameSize          = audioStream->codecpar->frame_size,&#xA;    audioSettings.codecExtraData     = std::move(extraData);&#xA;&#xA;    videoSettings.width              = 1920;&#xA;    videoSettings.height             = 1080;&#xA;    videoSettings.framerate          = 25;&#xA;    videoSettings.pixelFormat        = vl::enums::EPixelFormat::ARGB;&#xA;    videoSettings.bitrate            = 8000 * 1000;&#xA;    videoSettings.codec              = vl::enums::EVideoCodec::H264;&#xA;&#xA;    multimediaProcessing.initEncoder(videoSettings, audioSettings);&#xA;&#xA;    // *** INITIALIZE SWS CONTEXT *** //&#xA;    swsContext = sws_getCachedContext(nullptr, videoCodecContext->width, videoCodecContext->height, videoCodecContext->pix_fmt, videoCodecContext->width, videoCodecContext->height, AV_PIX_FMT_RGBA, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr);&#xA;&#xA;    if (const auto inReturn = av_image_get_buffer_size(AV_PIX_FMT_RGBA, videoCodecContext->width, videoCodecContext->height, 1); inReturn > 0)&#xA;    {&#xA;        frameBuffer.reserve(inReturn);&#xA;    }&#xA;    else&#xA;    {&#xA;        std::cout &lt;&lt; "Can not get buffer size." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    if (const auto inReturn = av_image_fill_arrays(frame->data, frame->linesize, frameBuffer.data(), AV_PIX_FMT_RGBA, videoCodecContext->width, videoCodecContext->height, 1); inReturn &lt; 0)&#xA;    {&#xA;        std::cout &lt;&lt; "Can not fill buffer arrays." &lt;&lt; std::endl;&#xA;        return EXIT_FAILURE;&#xA;    }&#xA;&#xA;    // *** MAIN LOOP *** //&#xA;    while(true)&#xA;    {&#xA;        // Return the next frame of a stream.&#xA;        if(av_read_frame(formatContext, &amp;packet) == 0)&#xA;        {&#xA;            if(packet.stream_index == videoIndex) // Check if it is video packet.&#xA;            {&#xA;                // Send packet to decoder.&#xA;                if(avcodec_send_packet(videoCodecContext, &amp;packet) == 0)&#xA;                {&#xA;                    int returnCode = avcodec_receive_frame(videoCodecContext, decoderFrame); // Get Frame from decoder.&#xA;&#xA;                    if (returnCode == 0) // Transform frame and send it to encoder. And re-stream that.&#xA;                    {&#xA;                        sws_scale(swsContext, decoderFrame->data, decoderFrame->linesize, 0, decoderFrame->height, frame->data, frame->linesize);&#xA;&#xA;                        mat = cv::Mat(videoCodecContext->height, videoCodecContext->width, CV_8UC4, frameBuffer.data(), frame->linesize[0]);&#xA;&#xA;                        cv::resize(mat, mat, cv::Size(1920, 1080), cv::INTER_NEAREST);&#xA;&#xA;                        multimediaProcessing.encode(mat.data, packet.dts, packet.dts, packet.flags == AV_PKT_FLAG_KEY); // Thise line sends cv::Mat to encoder and re-streams it.&#xA;&#xA;                        av_packet_unref(&amp;packet);&#xA;                    }&#xA;                    else if(returnCode == AVERROR(EAGAIN))&#xA;                    {&#xA;                        av_frame_unref(decoderFrame);&#xA;                        av_freep(decoderFrame);&#xA;                    }&#xA;                    else&#xA;                    {&#xA;                        av_frame_unref(decoderFrame);&#xA;                        av_freep(decoderFrame);&#xA;&#xA;                        std::cout &lt;&lt; "Error during decoding." &lt;&lt; std::endl;&#xA;                        return EXIT_FAILURE;&#xA;                    }&#xA;                }&#xA;            }&#xA;            else if(packet.stream_index == audioIndex) // Check if it is audio packet.&#xA;            {&#xA;                std::vector vectorPacket(packet.data, packet.data &#x2B; packet.size);&#xA;&#xA;                multimediaProcessing.addAudioPacket(vectorPacket, packet.dts, packet.dts);&#xA;            }&#xA;            else&#xA;            {&#xA;                av_packet_unref(&amp;packet);&#xA;            }&#xA;        }&#xA;        else&#xA;        {&#xA;            std::cout &lt;&lt; "Can not send video packet to decoder." &lt;&lt; std::endl;&#xA;            std::this_thread::sleep_for(std::chrono::seconds(1));&#xA;        }&#xA;    }&#xA;&#xA;    return EXIT_SUCCESS;&#xA;    }&#xA;</unsigned></string></iostream>

    &#xA;

    What does It do ?

    &#xA;

    It takes a single RTSP stream to decode its data so I can, for example, draw something to its frames or whatever, and then stream it under a different address.

    &#xA;

    Basically, I am opening the RTSP stream, check if it does contain both audio and video streams, and find a decoder for them. Then I create an encoder to which I will tell how the output stream should look like and that's it.

    &#xA;

    And this point I will create an endless loop Where I will read all packets coming from the input stream, then decode it does something to it and again encode it and re=stream it.

    &#xA;

    What is the issue ?

    &#xA;

    If you take a closer look I am sending both video and audio frame together with lastly received PTS and DTS contained in AVPacket, to the encoder.

    &#xA;

    The PTS and DTS from the point when I receive the first AVPacket looks for example like this.

    &#xA;

    IN AUDIO STREAM :

    &#xA;

    &#xA;

    -22783, -21759, -20735, -19711, -18687, -17663, -16639, -15615, -14591, -13567, -12543, -11519, -10495, -9471, -8447, -7423, -6399, -5375, -4351, -3327, -2303, -1279, -255, 769, 1793, 2817, 3841, 4865, 5889, 6913, 7937, 8961, 9985, 11009, 12033, 13057, 14081, 15105, 16129, 17153

    &#xA;

    &#xA;

    As you can see it is every time incremented by 1024 and that is a sample rate of the audio stream. Quite clear here.

    &#xA;

    IN VIDEO STREAM :

    &#xA;

    &#xA;

    86400, 90000, 93600, 97200, 100800, 104400, 108000, 111600, 115200, 118800, 122400, 126000, 129600, 133200, 136800, 140400, 144000, 147600, 151200, 154800, 158400, 162000, 165600

    &#xA;

    &#xA;

    As you can see it is every time incremented by 3600 but WHY ?. What this number actually mean ?

    &#xA;

    From what I can understand, those received PTS and DTS are for the following :

    &#xA;

    DTS should tell the encoder when it should start encoding the frame so the frame in time are in the correct order and not mishmashed.

    &#xA;

    PTS should say the correct time when the frame should be played/displayed in the output stream so the frame in time are in the correct order and not mishmashed.

    &#xA;

    What I am trying to achieve ?

    &#xA;

    As I said I need to restream a RTSP stream. I can not use PTS and DTS which comes from received AVPackets, because at some point it can happen that the input stream can randomly close and I need to open it again. The problem is that when I actually do it, then the PTS and DTS start to generate again from the minus values same as you could see in the samples. I CAN NOT send those "new" PTS and DTS to the encoder because they are now lower than the encoder/muxer expects.

    &#xA;

    I need to continually stream something (both audio and video), even it is a blank black screen or silent audio. And each frame the PTS and DTS should rise by a specific number. I need to figure out how the increment is calculated.

    &#xA;

    ----------------------------------

    &#xA;

    The final result should look like a mosaic of multiple input streams in a single output stream. A single input stream (main) has both audio and video and the rest (side) has just video. Some of those streams can randomly close in time and I need to ensure that it will be back again once it is possible.

    &#xA;

  • ffmpeg capture from ip camera video in h264 stream [closed]

    23 mars 2023, par Иванов Иван

    I can't read the frames from the camera and then write them to a video file (any). The fact is that I even get crooked frames, they seem to have violated the coordinates of the position of each point, the video is crooked, distorted

    &#xA;

    c++ code.

    &#xA;

    https://drive.google.com/file/d/1W2sZMR5D5pvVmnhiQyhiaQhC9frhdeII/view?usp=sharing

    &#xA;

     #define INBUF_SIZE 4096&#xA;&#xA;&#xA;    //writing the minimal required header for a pgm file format&#xA;    //portable graymap format-> https://en.wikipedia.org/wiki/Netpbm_format#PGM_example&#xA;    fprintf (f, "P5\n%d %d\n%d\n", xsize, ysize, 255);&#xA;&#xA;    //writing line by line&#xA;    for (i = 0; i /contains data on a configuration of media content, such as bitrate, &#xA;        //frame rate, sampling frequency, channels, height and many other things.&#xA;        AVCodecContext * AVCodecContext_ = NULL;&#xA;        AVCodecParameters * AVCodecParametr_ = NULL;&#xA;        FILE * f;&#xA;        //This structure describes decoded (raw) audio- or video this.&#xA;        AVFrame * frame;&#xA;        uint8_t inbuf [INBUF_SIZE &#x2B; AV_INPUT_BUFFER_PADDING_SIZE];&#xA;        uint8_t * data;&#xA;        size_t data_size;&#xA;        int ret;&#xA;        int eof;&#xA;        AVFormatContext * AVfc = NULL;&#xA;        int ERRORS;&#xA;        //AVCodec * codec;&#xA;        char buf [1024];&#xA;        const char * FileName;&#xA;    &#xA;        //https://habr.com/ru/post/137793/&#xA;        //Stores the compressed one shot.&#xA;        AVPacket * pkt;&#xA;    &#xA;        //**********************************************************************&#xA;        //Beginning of reading video from the camera. &#xA;        //**********************************************************************&#xA;    &#xA;        avdevice_register_all ();&#xA;    &#xA;        filename = "rtsp://admin: 754HG@192.168.1.75:554/11";&#xA;        //filename = "c:\\1.avi";&#xA;        outfilename = "C:\\2.MP4";&#xA;    &#xA;        //We open a flow of video (it is the file or the camera). &#xA;        ERRORS = avformat_open_input (&amp; AVfc, filename, NULL, NULL);&#xA;        if (ERRORS &lt;0) {&#xA;            fprintf (stderr, "ffmpeg: could not open file \n");&#xA;            return-1;&#xA;        }&#xA;    &#xA;        //After opening, we can print out information on the video file (iformat = the name of a format; &#xA;        //duration = duration). But as I connected the camera to me wrote: Duration: N/A, &#xA;        //start: 0.000000, bitrate: N/A&#xA;        printf ("Format %s, duration %lld us", AVfc-> iformat-> long_name, AVfc-> duration);&#xA;    &#xA;    &#xA;        ERRORS = avformat_find_stream_info (AVfc, NULL);&#xA;        if (ERRORS &lt;0) {&#xA;            fprintf (stderr, "ffmpeg: Unable to find stream info\n");&#xA;            return-1;&#xA;        }&#xA;    &#xA;    &#xA;        int CountStream;&#xA;    &#xA;        //We learn quantity of streams. &#xA;        CountStream = AVfc-> nb_streams;&#xA;    &#xA;        //Let&#x27;s look for the codec. &#xA;        int video_stream;&#xA;        for (video_stream = 0; video_stream  nb_streams; &#x2B;&#x2B; video_stream) {&#xA;            if (AVfc-> streams[video_stream]-> codecpar-> codec_type == AVMEDIA_TYPE_VIDEO) {&#xA;                break;&#xA;            }&#xA;    &#xA;        }&#xA;    &#xA;        if (video_stream == AVfc-> nb_streams) {&#xA;            fprintf (stderr, "ffmpeg: Unable to find video stream\n");&#xA;            return-1;&#xA;        }&#xA;    &#xA;        //Here we define a type of the codec, for my camera it is equal as AV_CODEC_ID_HEVC (This that in what is broadcast by my camera)&#xA;        codec = avcodec_find_decoder(AVfc-> streams [video_stream]-> codecpar-> codec_id);&#xA;        //--------------------------------------------------------------------------------------&#xA;    &#xA;        //Functions for inquiry of opportunities of libavcodec,&#xA;        AVCodecContext_ = avcodec_alloc_context3(codec);&#xA;        if (! AVCodecContext _) {&#xA;            fprintf (stderr, "Was not succeeded to allocate a video codec context, since it not poddrerzhivayetsya\n");&#xA;            exit(1);&#xA;        }&#xA;    &#xA;        //This function is used for initialization &#xA;        //AVCodecContext of video and audio of the codec. The announcement of avcodec_open2 () is in libavcodecavcodec.h&#xA;        //We open the codec. &#xA;    &#xA;        ERRORS = avcodec_open2 (AVCodecContext _, codec, NULL);&#xA;        if (ERRORS &lt;0) {&#xA;            fprintf (stderr, "ffmpeg: It is not possible to open codec \n");&#xA;            return-1;&#xA;        }&#xA;    &#xA;        //It for processing of a sound - a reserve.&#xA;        //swr_alloc_set_opts ()&#xA;        //swr_init (); &#xA;    &#xA;        //To output all information on the video file. &#xA;        av_dump_format (AVfc, 0, argv[1], 0);&#xA;    &#xA;        //=========================================================================================&#xA;        //Further, we receive frames. before we only received all infomration about the entering video.&#xA;        //=========================================================================================&#xA;    &#xA;        //Now we are going to read packages from a stream and to decode them in shots, but at first &#xA;        //we need to mark out memory for both components (AVPacket and AVFrame).&#xA;        frame = av_frame_alloc ();&#xA;    &#xA;        if (! frame) {&#xA;            fprintf (stderr, "Is not possible to mark out memory for video footage \n");&#xA;            exit(1);&#xA;        }&#xA;        //We mark out memory for a package &#xA;        pkt = av_packet_alloc ();&#xA;        //We define a file name for saving the picture.&#xA;        const char * FileName1 = "C:\\Users\\Павел\\Desktop\\NyFile.PGM";&#xA;        //Data reading if they is. &#xA;        while (av_read_frame (AVfc, pkt)> = 0) {&#xA;            //It is a package from a video stream? Because there is still a soundtrack.&#xA;            if (pkt-> stream_index == video_stream) {&#xA;                int ret;&#xA;    &#xA;                //Transfer of the raw package data as input data in the decoder&#xA;                ret = avcodec_send_packet (AVCodecContext _, pkt);&#xA;                if (ret &lt;0 | | ret == AVERROR(EAGAIN) | | ret == AVERROR_EOF) {&#xA;                    std:: cout &lt;&lt;"avcodec_send_packet:" &lt;<ret while="while"> = 0) {&#xA;    &#xA;                    //Returns the decoded output data from the decoder or the encoder&#xA;                    ret = avcodec_receive_frame (AVCodecContext _, frame);&#xA;                    if (ret == AVERROR(EAGAIN) | | ret == AVERROR_EOF) {&#xA;                        //std:: cout &lt;&lt;"avcodec_receive_frame:" &lt;<ret cout="cout"> of frame_number &lt;/============================================================================================&#xA;    &#xA;                    //Experimentally - we will keep a shot in the picture. &#xA;    &#xA;                    save_gray_frame(frame-> data [0], frame-> linesize [0], frame-> width, frame-> height, (char *) FileName1);&#xA;                }&#xA;            }&#xA;        }&#xA;    &#xA;        //av_parser_close(parser);&#xA;        avcodec_free_context (&amp; AVCodecContext _);&#xA;        av_frame_free (&amp; frame);&#xA;        av_packet_free (&amp; pkt);&#xA;    &#xA;        return 0;&#xA;</ret></ret>

    &#xA;

  • avformat/avienc : add reserve_index_space option

    25 janvier 2017, par Tobias Rapp
    avformat/avienc : add reserve_index_space option
    

    Allows the user to reserve space for the ODML master index. A sufficient
    sized master index in the AVI header avoids storing follow-up master
    indexes within the ’movi’ data later. If the option is omitted or zero
    the index size is estimated from output duration and bitrate.

    Reviewed-by : Michael Niedermayer <michael@niedermayer.cc>
    Signed-off-by : Tobias Rapp <t.rapp@noa-archive.com>

    • [DH] libavformat/avi.h
    • [DH] libavformat/avienc.c
    • [DH] libavformat/version.h