Recherche avancée

Médias (1)

Mot : - Tags -/ogg

Autres articles (106)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

  • ANNEXE : Les plugins utilisés spécifiquement pour la ferme

    5 mars 2010, par

    Le site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)

Sur d’autres sites (16473)

  • Ffmpeg error "avcodec_send_frame" return "invalid argument"

    17 octobre 2023, par Paulo Coutinho

    I have a problem in function avcodec_send_frame throwing error Error sending frame for encoding: Invalid argument (-22). I already search, check, recheck and nothing. It is near the ffmpeg examples. Can anyone help me ? Thanks.

    


    This is my code :

    


    static void callbackAddSubtitle(const Message &m, const Response r)
{
    try
    {
        av_log_set_level(AV_LOG_DEBUG);

        spdlog::debug("[Mapping :: callbackAddSubtitle] Adding subtitle...");

        auto inputOpt = m.get("input");
        auto outputOpt = m.get("output");

        if (!inputOpt.has_value() || !outputOpt.has_value())
        {
            r(std::string{"INVALID-PARAMS"});
            return;
        }

        const std::string &input = inputOpt.value();
        const std::string &output = outputOpt.value();

        // initialize input
        spdlog::debug("[Mapping :: callbackAddSubtitle] Initializing input video...");

        AVFormatContext *inputFormatCtx = avformat_alloc_context();
        if (avformat_open_input(&inputFormatCtx, input.c_str(), nullptr, nullptr) != 0)
        {
            spdlog::error("Failed to open input");
            r(std::string{"ERROR-OPEN-INPUT"});
            return;
        }

        if (avformat_find_stream_info(inputFormatCtx, nullptr) < 0)
        {
            spdlog::error("Failed to find stream information");
            avformat_close_input(&inputFormatCtx);
            r(std::string{"ERROR-FIND-STREAM"});
            return;
        }

        int videoStreamIndex = av_find_best_stream(inputFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
        if (videoStreamIndex < 0)
        {
            spdlog::error("Could not find a video stream");
            r(std::string{"ERROR-FIND-VIDEO-STREAM"});
            return;
        }

        AVRational timeBase = inputFormatCtx->streams[videoStreamIndex]->time_base;

        AVCodecParameters *inputCodecPar = inputFormatCtx->streams[videoStreamIndex]->codecpar;
        const AVCodec *inputCodec = avcodec_find_decoder(inputCodecPar->codec_id);
        AVCodecContext *inputCodecCtx = avcodec_alloc_context3(inputCodec);

        avcodec_parameters_to_context(inputCodecCtx, inputCodecPar);
        avcodec_open2(inputCodecCtx, inputCodec, nullptr);

        // initialize input audio
        spdlog::debug("[Mapping :: callbackAddSubtitle] Initializing input audio...");

        int audioStreamIndex = av_find_best_stream(inputFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0);
        if (audioStreamIndex < 0)
        {
            spdlog::error("Could not find an audio stream");
            r(std::string{"ERROR-FIND-AUDIO-STREAM"});
            return;
        }

        AVCodecParameters *inputAudioCodecPar = inputFormatCtx->streams[audioStreamIndex]->codecpar;
        const AVCodec *inputAudioCodec = avcodec_find_decoder(inputAudioCodecPar->codec_id);
        AVCodecContext *inputAudioCodecCtx = avcodec_alloc_context3(inputAudioCodec);

        avcodec_parameters_to_context(inputAudioCodecCtx, inputAudioCodecPar);
        avcodec_open2(inputAudioCodecCtx, inputAudioCodec, nullptr);

        // initialize output video
        spdlog::debug("[Mapping :: callbackAddSubtitle] Initializing output video...");

        AVFormatContext *outputFormatCtx = nullptr;
        avformat_alloc_output_context2(&outputFormatCtx, nullptr, nullptr, output.c_str());
        AVStream *outputStream = avformat_new_stream(outputFormatCtx, nullptr);

        AVCodecContext *outputCodecCtx = avcodec_alloc_context3(inputCodec);
        avcodec_parameters_to_context(outputCodecCtx, inputCodecPar);
        int retOutVideo = avcodec_open2(outputCodecCtx, inputCodec, nullptr);

        if (retOutVideo < 0)
        {
            char err[AV_ERROR_MAX_STRING_SIZE];
            av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, retOutVideo);
            spdlog::error("Failed to initialize output video: {}", err);
            r(std::string{"ERROR-INIT-OUTPUT-VIDEO"});
            return;
        }

        outputStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
        outputStream->codecpar->codec_id = inputCodec->id;
        avcodec_parameters_from_context(outputStream->codecpar, outputCodecCtx);

        if (!(outputFormatCtx->oformat->flags & AVFMT_NOFILE))
        {
            avio_open(&outputFormatCtx->pb, output.c_str(), AVIO_FLAG_WRITE);
        }

        const char *pixelFormatName = getPixelFormatName(outputCodecCtx->pix_fmt);
        spdlog::debug("Pixel Format: {}", pixelFormatName);

        // initialize output audio
        spdlog::debug("[Mapping :: callbackAddSubtitle] Initializing output audio...");

        AVStream *outputAudioStream = avformat_new_stream(outputFormatCtx, nullptr);
        AVCodecContext *outputAudioCodecCtx = avcodec_alloc_context3(inputAudioCodec);
        avcodec_parameters_to_context(outputAudioCodecCtx, inputAudioCodecPar);
        int retOutAudio = avcodec_open2(outputAudioCodecCtx, inputAudioCodec, nullptr);

        if (retOutAudio < 0)
        {
            char err[AV_ERROR_MAX_STRING_SIZE];
            av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, retOutAudio);
            spdlog::error("Failed to initialize output audio: {}", err);
            r(std::string{"ERROR-INIT-OUTPUT-AUDIO"});
            return;
        }

        outputAudioStream->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
        outputAudioStream->codecpar->codec_id = inputAudioCodec->id;
        avcodec_parameters_from_context(outputAudioStream->codecpar, outputAudioCodecCtx);

        // initialize filters
        spdlog::debug("[Mapping :: callbackAddSubtitle] Initializing filters...");

        AVFilterGraph *filterGraph = avfilter_graph_alloc();
        if (!filterGraph)
        {
            spdlog::error("Failed to allocate filter graph");
            r(std::string{"ERROR-FILTER-GRAPH"});
            return;
        }

        AVFilterContext *bufferSinkCtx;
        AVFilterContext *bufferSrcCtx;

        const AVFilter *bufferSink = avfilter_get_by_name("buffersink");
        const AVFilter *bufferSrc = avfilter_get_by_name("buffer");

        // input filter
        char filterInArgs[512];
        snprintf(filterInArgs, sizeof(filterInArgs), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", inputCodecPar->width, inputCodecPar->height, inputCodecCtx->pix_fmt, timeBase.num, timeBase.den, inputCodecCtx->sample_aspect_ratio.num, inputCodecCtx->sample_aspect_ratio.den);

        spdlog::debug("[Mapping :: callbackAddSubtitle] Buffer src args: {}", filterInArgs);

        int retFilterIn = avfilter_graph_create_filter(&bufferSrcCtx, bufferSrc, "in", filterInArgs, nullptr, filterGraph);
        if (retFilterIn < 0)
        {
            char err[AV_ERROR_MAX_STRING_SIZE];
            av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, retFilterIn);
            spdlog::error("Failed to create bufferSrcCtx: {}", err);
            r(std::string{"ERROR-CREATE-FILTER-SRC"});
            return;
        }

        // output filter
        int retFilterOut = avfilter_graph_create_filter(&bufferSinkCtx, bufferSink, "out", nullptr, nullptr, filterGraph);

        if (retFilterOut < 0)
        {
            char err[AV_ERROR_MAX_STRING_SIZE];
            av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, retFilterOut);
            spdlog::error("Failed to create bufferSinkCtx: {}", err);
            r(std::string{"ERROR-CREATE-FILTER-SINK"});
            return;
        }

        enum AVPixelFormat pix_fmts[] = {AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE};
        av_opt_set_int_list(bufferSinkCtx, "pix_fmts", pix_fmts, AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN);

        // add filters to graph and link them
        const char *filterSpec = "drawtext=text='Legenda Adicionada Automaticamente Via FFMPEG e C++': fontcolor=yellow: bordercolor=black: fontfile='/Users/paulo/Downloads/roboto/Roboto-Black.ttf'";
        const AVFilter *filter = avfilter_get_by_name("drawtext");

        AVFilterInOut *outputs = avfilter_inout_alloc();
        AVFilterInOut *inputs = avfilter_inout_alloc();

        outputs->name = av_strdup("in");
        outputs->filter_ctx = bufferSrcCtx;
        outputs->pad_idx = 0;
        outputs->next = nullptr;
        inputs->name = av_strdup("out");
        inputs->filter_ctx = bufferSinkCtx;
        inputs->pad_idx = 0;
        inputs->next = nullptr;

        if (avfilter_graph_parse_ptr(filterGraph, filterSpec, &inputs, &outputs, nullptr) < 0)
        {
            spdlog::error("Failed to parse filter graph");
            r(std::string{"ERROR-PARSE-FILTER"});
            return;
        }

        if (avfilter_graph_config(filterGraph, nullptr) < 0)
        {
            spdlog::error("Failed to configure filter graph");
            r(std::string{"ERROR-CONFIG-FILTER"});
            return;
        }

        // header
        spdlog::debug("[Mapping :: callbackAddSubtitle] Writing header...");

        if (avformat_write_header(outputFormatCtx, nullptr) < 0)
        {
            spdlog::error("Error writing header");
            r(std::string{"ERROR-WRITE-HEADER"});
            return;
        }

        // read frames and write to output
        AVPacket *packet = av_packet_alloc();
        AVFrame *frame = av_frame_alloc();

        frame->format = inputCodecCtx->pix_fmt;
        frame->width = inputCodecCtx->width;
        frame->height = inputCodecCtx->height;

        AVFrame *filt_frame = av_frame_alloc();

        filt_frame->format = inputCodecCtx->pix_fmt;
        filt_frame->width = inputCodecCtx->width;
        filt_frame->height = inputCodecCtx->height;

        while (av_read_frame(inputFormatCtx, packet) >= 0)
        {
            if (packet->stream_index == videoStreamIndex)
            {
                if (avcodec_send_packet(inputCodecCtx, packet) < 0)
                {
                    spdlog::error("Error sending packet for decoding");
                    r(std::string{"ERROR-SEND-PACKET-DECODE"});
                    return;
                }

                while (avcodec_receive_frame(inputCodecCtx, frame) == 0)
                {
                    // Envia o quadro decodificado para o gráfico de filtro
                    if (av_buffersrc_add_frame_flags(bufferSrcCtx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0)
                    {
                        spdlog::error("Error while feeding the filtergraph");
                        r(std::string{"ERROR-FEED-FILTERGRAPH"});
                        return;
                    }

                    // Recebe um quadro do gráfico de filtro
                    if (av_buffersink_get_frame(bufferSinkCtx, filt_frame) < 0)
                    {
                        spdlog::error("Error while receiving the filtered frame");
                        r(std::string{"ERROR-RECEIVE-FILTERED-FRAME"});
                        return;
                    }

                    // Envia o quadro decodificado para re-codificação
                    int retSendFrame = avcodec_send_frame(outputCodecCtx, filt_frame);
                    if (retSendFrame < 0)
                    {
                        char err[AV_ERROR_MAX_STRING_SIZE];
                        av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, retSendFrame);
                        spdlog::error("Error sending frame for encoding: {}", err);
                        r(std::string{"ERROR-SEND-FRAME-ENCODE"});
                        return;
                    }

                    AVPacket *output_packet = av_packet_alloc();
                    output_packet->data = nullptr;
                    output_packet->size = 0;

                    // Re-codifica filt_frame para um pacote
                    if (avcodec_receive_packet(outputCodecCtx, output_packet) == 0)
                    {
                        // Escreve o pacote no fluxo de saída
                        av_write_frame(outputFormatCtx, output_packet);
                        av_packet_unref(output_packet);
                    }

                    av_frame_unref(filt_frame);
                }

                // time
                packet->pts = av_rescale_q_rnd(packet->pts, inputFormatCtx->streams[videoStreamIndex]->time_base, outputFormatCtx->streams[videoStreamIndex]->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
                packet->dts = av_rescale_q_rnd(packet->dts, inputFormatCtx->streams[videoStreamIndex]->time_base, outputFormatCtx->streams[videoStreamIndex]->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
                packet->duration = av_rescale_q(packet->duration, inputFormatCtx->streams[videoStreamIndex]->time_base, outputFormatCtx->streams[videoStreamIndex]->time_base);
                packet->stream_index = videoStreamIndex;

                // write packet to output video stream
                av_interleaved_write_frame(outputFormatCtx, packet);
            }
            else if (packet->stream_index == audioStreamIndex)
            {
                // rescale timestamps
                packet->pts = av_rescale_q_rnd(packet->pts, inputFormatCtx->streams[audioStreamIndex]->time_base, outputFormatCtx->streams[audioStreamIndex]->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
                packet->dts = av_rescale_q_rnd(packet->dts, inputFormatCtx->streams[audioStreamIndex]->time_base, outputFormatCtx->streams[audioStreamIndex]->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
                packet->duration = av_rescale_q(packet->duration, inputFormatCtx->streams[audioStreamIndex]->time_base, outputFormatCtx->streams[audioStreamIndex]->time_base);
                packet->stream_index = audioStreamIndex;

                // write packet to output audio stream
                av_interleaved_write_frame(outputFormatCtx, packet);
            }

            av_packet_unref(packet);
        }

        av_packet_free(&packet);
        av_frame_free(&frame);
        av_frame_free(&filt_frame);

        spdlog::debug("[Mapping :: callbackAddSubtitle] Writing trailer...");

        if (av_write_trailer(outputFormatCtx) < 0)
        {
            spdlog::error("Error writing trailer");
            r(std::string{"ERROR-WRITE-TRAILER"});
            return;
        }

        // cleanup
        spdlog::debug("[Mapping :: callbackAddSubtitle] Cleaning...");

        if (!(outputFormatCtx->oformat->flags & AVFMT_NOFILE))
        {
            avio_closep(&outputFormatCtx->pb);
        }

        avcodec_free_context(&inputCodecCtx);
        avcodec_free_context(&inputAudioCodecCtx);
        avcodec_free_context(&outputCodecCtx);
        avcodec_free_context(&outputAudioCodecCtx);

        avformat_free_context(inputFormatCtx);
        avformat_free_context(outputFormatCtx);

        r(std::string{"OK"});
    }
    catch (const std::exception &e)
    {
        spdlog::error("Error: {}", e.what());
        r(std::string{"ERROR"});
    }
}


    


    The error is :

    


    [2023-10-17 06:30:16.936] [debug] [Mapping :: callbackAddSubtitle] Adding subtitle...
[2023-10-17 06:30:16.936] [debug] [Mapping :: callbackAddSubtitle] Initializing input video...
[NULL @ 0x153604a60] Opening '/Users/paulo/Downloads/movie.mp4' for reading
[file @ 0x6000001fd170] Setting default whitelist 'file,crypto,data'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] ISO: File Type Major Brand: isom
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] Unknown dref type 0x206c7275 size 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] Processing st: 0, edit list 0 - media time: 0, duration: 2669670
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] Unknown dref type 0x206c7275 size 12
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] Processing st: 1, edit list 0 - media time: 1024, duration: 4272096
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] drop a frame at curr_cts: 0 @ 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] Before avformat_find_stream_info() pos: 113542488 bytes read:110788 seeks:1 nb_streams:2
[h264 @ 0x153604cd0] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x153604cd0] Decoding VUI
[h264 @ 0x153604cd0] nal_unit_type: 8(PPS), nal_ref_idc: 3
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] demuxer injecting skip 1024 / discard 0
[aac @ 0x1536056f0] skip 1024 / discard 0 samples due to side data
[h264 @ 0x153604cd0] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x153604cd0] Decoding VUI
[h264 @ 0x153604cd0] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 0x153604cd0] nal_unit_type: 6(SEI), nal_ref_idc: 0
[h264 @ 0x153604cd0] nal_unit_type: 5(IDR), nal_ref_idc: 3
[h264 @ 0x153604cd0] Format yuv420p chosen by get_format().
[h264 @ 0x153604cd0] Reinit context to 1088x1920, pix_fmt: yuv420p
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] All info found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x153604a60] After avformat_find_stream_info() pos: 195211 bytes read:305951 seeks:2 frames:2
[2023-10-17 06:30:18.160] [debug] [Mapping :: callbackAddSubtitle] Initializing input audio...
[h264 @ 0x143604330] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x143604330] Decoding VUI
[h264 @ 0x143604330] nal_unit_type: 8(PPS), nal_ref_idc: 3
[2023-10-17 06:30:18.160] [debug] [Mapping :: callbackAddSubtitle] Initializing output video...
[h264 @ 0x143611ec0] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 0x143611ec0] Decoding VUI
[h264 @ 0x143611ec0] nal_unit_type: 8(PPS), nal_ref_idc: 3
[file @ 0x6000001f4000] Setting default whitelist 'file,crypto,data'
[2023-10-17 06:30:18.167] [debug] Pixel Format: YUV420P
[2023-10-17 06:30:18.167] [debug] [Mapping :: callbackAddSubtitle] Initializing output audio...
[2023-10-17 06:30:18.167] [debug] [Mapping :: callbackAddSubtitle] Initializing filters...
[2023-10-17 06:30:18.168] [debug] [Mapping :: callbackAddSubtitle] Buffer src args: video_size=1080x1920:pix_fmt=0:time_base=1/30000:pixel_aspect=1/1
detected 10 logical cores
[in @ 0x6000004ec0b0] Setting 'video_size' to value '1080x1920'
[in @ 0x6000004ec0b0] Setting 'pix_fmt' to value '0'
[in @ 0x6000004ec0b0] Setting 'time_base' to value '1/30000'
[in @ 0x6000004ec0b0] Setting 'pixel_aspect' to value '1/1'
[in @ 0x6000004ec0b0] w:1080 h:1920 pixfmt:yuv420p tb:1/30000 fr:0/1 sar:1/1
[AVFilterGraph @ 0x6000017e8000] Setting 'text' to value 'Legenda Adicionada Automaticamente Via FFMPEG e C++'
[AVFilterGraph @ 0x6000017e8000] Setting 'fontcolor' to value 'yellow'
[AVFilterGraph @ 0x6000017e8000] Setting 'bordercolor' to value 'black'
[AVFilterGraph @ 0x6000017e8000] Setting 'fontfile' to value '/Users/paulo/Downloads/roboto/Roboto-Black.ttf'
[AVFilterGraph @ 0x6000017e8000] query_formats: 3 queried, 2 merged, 0 already done, 0 delayed
[2023-10-17 06:30:18.172] [debug] [Mapping :: callbackAddSubtitle] Writing header...
[h264 @ 0x143604330] nal_unit_type: 6(SEI), nal_ref_idc: 0
[h264 @ 0x143604330] nal_unit_type: 5(IDR), nal_ref_idc: 3
[h264 @ 0x143604330] Format yuv420p chosen by get_format().
[h264 @ 0x143604330] Reinit context to 1088x1920, pix_fmt: yuv420p
[Parsed_drawtext_0 @ 0x6000004f4160] Copying data in avfilter.
[Parsed_drawtext_0 @ 0x6000004f4160] n:0 t:0.000000 text_w:424 text_h:16 x:0 y:0
[2023-10-17 06:30:18.182] [error] Error sending frame for encoding: Invalid argument
Returned Value: ERROR-SEND-FRAME-ENCODE


    


  • Read existing MP4 File and write into a new MP4 file using libavcodec

    4 octobre 2023, par Tahfimul

    I am new to the libavcodec space.

    


    I am trying to read video and audio streams from an existing mp4 file and take the data from the two streams and then mux the two streams and write the muxed data into a new mp4 file using libavcodec in C++. Essentially, I am aiming to split the original (existing) mp4 file into small chunks of 1 second clips that then can be played back using a video player. I would like to preserve the original mp4 video's video stream (i.e. preserve its color, resolution and etc.) and preserve the mp4 video's audio stream (i.e. preserve its bit rate and etc.). I am trying to achieve this using libavcodec in C++. But there does not seem to be any tutorial or documentation online that points me to that direction.

    


    So far, I have looked at and tried to implement a solution using this tutorial (tutorial#1) : https://github.com/leandromoreira/ffmpeg-libav-tutorial/blob/master/0_hello_world.c

    


    However, tutorial#1 aimed to save each video frame from the existing (original) mp4 video stream into individual .pgm files, which meant that the .pgm files would store a grayscale image of each video frame.

    


    Since, I want to preserve the colors of the original (existing) mp4 file, I looked at this tutorial (tutorial#2) that aimed to convert the grayscale video frame into color using the swscale library : https://www.youtube.com/watch?v=Y7SUm7Xf1sc&ab_channel=Bartholomew
However, in tutorial#2, they exported the output from swscale library to a GUI library to be viewed in a GUI application and did not show hwo to write the output data into a new mp4 file that can be played back by a video player.

    


    So then, I looked at this tutorial(tutorial#3) which showed how to create an MP4 file using libavcodec : C++ FFmpeg create mp4 file
However, the problem with that solution is that I was not able to take a video frame from the original mp4 video and store it into another mp4 file. I kept getting errors when attempting to do so and I did not succeed in taking the data from the original(existing) mp4 file and storing it into a new mp4 file.

    


    Here is the code that I have written so far :

    


    #include<fstream>&#xA;#include &#xA;#include &#xA;#include &#xA;extern "C"&#xA;{&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libavutil></libavutil>mathematics.h>&#xA;#include <libswscale></libswscale>swscale.h>&#xA;#include <libavfilter></libavfilter>buffersrc.h>&#xA;#include <libavfilter></libavfilter>buffersink.h>&#xA;#include <libavutil></libavutil>time.h>&#xA;#include <libavutil></libavutil>opt.h>&#xA;}&#xA;#pragma comment(lib, "avfilter.lib")&#xA;#ifdef av_err2str&#xA;#undef av_err2str&#xA;#include <string>&#xA;av_always_inline std::string av_err2string(int errnum) {&#xA;    char str[AV_ERROR_MAX_STRING_SIZE];&#xA;    return av_make_error_string(str, AV_ERROR_MAX_STRING_SIZE, errnum);&#xA;}&#xA;#define av_err2str(err) av_err2string(err).c_str()&#xA;#endif  // av_err2str&#xA;&#xA;#include <chrono>&#xA;#include <thread>&#xA;&#xA;&#xA;// decode packets into frames&#xA;static int decode_packet(AVPacket *pPacket, AVCodecContext *pCodecContext, AVFrame *pFrame);&#xA;&#xA;static void pushFrame(AVFrame* frame, AVCodecContext* outputCodecContext, AVPacket * outputPacket, AVFormatContext* outputFormatContext, AVCodec *outputCodec) {&#xA;    &#xA;    std::cout&lt;&lt;"outputCodecContext: "&lt;format = AV_PIX_FMT_YUV420P;&#xA;        frame->width = 800;&#xA;        frame->height = 800;&#xA;        if ((err = av_frame_get_buffer(frame, 32)) &lt; 0) {&#xA;            std::cout &lt;&lt; "Failed to allocate picture" &lt;&lt; err &lt;&lt; std::endl;&#xA;            return;&#xA;        }&#xA;    }&#xA;    SwsContext* swsCtx = nullptr;&#xA;    if (!swsCtx) {&#xA;        swsCtx = sws_getContext(800, 800, AV_PIX_FMT_RGB24, 800, &#xA;            800, AV_PIX_FMT_YUV420P, SWS_BICUBIC, 0, 0, 0);&#xA;    }&#xA;    int inLinesize[1] = { 3 * 800 };&#xA;    // From RGB to YUV&#xA;    // sws_scale(swsCtx, (const uint8_t* const*)&amp;data, inLinesize, 0, 800, &#xA;        // frame->data, frame->linesize);&#xA;    std::cout&lt;&lt;"frame "&lt;pts = (1.0 / 30.0) * 90000 * (1);&#xA;    // std::cout &lt;&lt; videoFrame->pts &lt;&lt; " " &lt;&lt; cctx->time_base.num &lt;&lt; " " &lt;&lt; &#xA;    //     cctx->time_base.den &lt;&lt; " " &lt;&lt; 1 &lt;&lt; std::endl;&#xA;    if ((err = avcodec_send_frame(outputCodecContext, frame)) &lt; 0) {&#xA;        std::cout &lt;&lt; "Failed to send frame" &lt;&lt; err &lt;&lt; std::endl;&#xA;        return;&#xA;    }&#xA;    AV_TIME_BASE;&#xA;    AVPacket pkt;&#xA;    av_init_packet(&amp;pkt);&#xA;    pkt.data = NULL;&#xA;    pkt.size = 0;&#xA;    pkt.flags |= AV_PKT_FLAG_KEY;&#xA;    std::cout&lt;&lt;"here\n";&#xA;    if (avcodec_receive_packet(outputCodecContext, outputPacket) == 0) {&#xA;        static int counter = 0;&#xA;        if (counter == 0) {&#xA;            FILE* fp = fopen("dump_first_frame1.dat", "wb");&#xA;            fwrite(outputPacket->data, outputPacket->size, 1, fp);&#xA;            fclose(fp);&#xA;        }&#xA;        // std::cout &lt;&lt; "pkt key: " &lt;&lt; (pkt.flags &amp; AV_PKT_FLAG_KEY) &lt;&lt; " " &lt;&lt; &#xA;        //     pkt.size &lt;&lt; " " &lt;&lt; (counter&#x2B;&#x2B;) &lt;&lt; std::endl;&#xA;        // uint8_t* size = ((uint8_t*)pkt.data);&#xA;        // std::cout &lt;&lt; "first: " &lt;&lt; (int)size[0] &lt;&lt; " " &lt;&lt; (int)size[1] &lt;&lt; &#xA;        //     " " &lt;&lt; (int)size[2] &lt;&lt; " " &lt;&lt; (int)size[3] &lt;&lt; " " &lt;&lt; (int)size[4] &lt;&lt; &#xA;        //     " " &lt;&lt; (int)size[5] &lt;&lt; " " &lt;&lt; (int)size[6] &lt;&lt; " " &lt;&lt; (int)size[7] &lt;&lt; &#xA;        //     std::endl;&#xA;        av_interleaved_write_frame(outputFormatContext, outputPacket);&#xA;        av_packet_unref(outputPacket);&#xA;    }&#xA;}&#xA;&#xA;int main()&#xA;{&#xA;&#xA;    char* filename = "c&#x2B;&#x2B;.mp4";&#xA;&#xA;    AVFormatContext *pFormatContext = avformat_alloc_context();&#xA;&#xA;    AVOutputFormat* outputFormat = NULL;&#xA;&#xA;    AVFormatContext* outputFormatContext = nullptr;&#xA;&#xA;    AVCodecContext* outputCodecContext = nullptr;&#xA;&#xA;    if (!pFormatContext) {&#xA;        std::cerr&lt;&lt;"ERROR could not allocate memory for Format Context\n";&#xA;        return -1;&#xA;    }&#xA;&#xA;    if (avformat_open_input(&amp;pFormatContext, filename , NULL, NULL) != 0) {&#xA;        std::cerr&lt;&lt;"ERROR could not open the file\n";&#xA;            return -1;&#xA;    }&#xA;&#xA;    std::cout&lt;&lt;"format: "&lt;iformat->name&lt;&lt;" , duration:"&lt;&lt;(double)(pFormatContext->duration/AV_TIME_BASE)&lt;&lt;"seconds, bit_rate:"&lt;bit_rate&lt;video_codec);&#xA;&#xA;    &#xA;    if (!outputCodec)&#xA;    {&#xA;        std::cout &lt;&lt; "can&#x27;t create output codec" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }   &#xA;    &#xA;&#xA;    AVStream* outputStream = avformat_new_stream(outputFormatContext, outputCodec);&#xA;&#xA;    if (!outputStream)&#xA;    {&#xA;        std::cout &lt;&lt; "can&#x27;t find output format" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    outputCodecContext = avcodec_alloc_context3(outputCodec);&#xA;&#xA;    if (!outputCodecContext)&#xA;    {&#xA;        std::cout &lt;&lt; "can&#x27;t create output codec context" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    AVCodec *pCodec = NULL;&#xA;&#xA;    AVCodecParameters *pCodecParameters =  NULL;&#xA;&#xA;    int video_stream_index = -1;&#xA;&#xA;    AVStream* stream = NULL;&#xA;    &#xA;    // loop though all the streams and print its main information&#xA;    for (int i = 0; i &lt; pFormatContext->nb_streams; i&#x2B;&#x2B;)&#xA;     {&#xA;        &#xA;        AVCodecParameters *pLocalCodecParameters =  NULL;&#xA;        pLocalCodecParameters = pFormatContext->streams[i]->codecpar;&#xA;&#xA;        AVCodec *pLocalCodec = NULL;&#xA;        pLocalCodec = avcodec_find_decoder(pLocalCodecParameters->codec_id);&#xA;        if (pLocalCodec==NULL) {&#xA;            std::cerr&lt;&lt;"ERROR unsupported codec!\n";&#xA;                // In this example if the codec is not found we just skip it&#xA;                continue;&#xA;            }&#xA;&#xA;&#xA;        if (pLocalCodecParameters->codec_type == AVMEDIA_TYPE_VIDEO) {&#xA;                if (video_stream_index == -1) {&#xA;                    video_stream_index = i;&#xA;                    pCodec = pLocalCodec;&#xA;                    pCodecParameters = pLocalCodecParameters;&#xA;                    stream = pFormatContext->streams[i];&#xA;                    std::cout&lt;&lt;"codec id: "&lt;codecpar->codec_id&lt;codecpar->codec_type&lt;codecpar->width&lt;codecpar->height&lt;codecpar->format&lt;codecpar->bit_rate&lt;codecpar->codec_id = outputFormat->video_codec;&#xA;                    // outputStream->codecpar->codec_id = stream->codecpar->codec_id;&#xA;                    outputStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;                    outputStream->codecpar->width = stream->codecpar->width;&#xA;                    outputStream->codecpar->height = stream->codecpar->height;&#xA;                    outputStream->codecpar->format = AV_PIX_FMT_YUV420P;&#xA;                    outputStream->codecpar->bit_rate = stream->codecpar->bit_rate;&#xA;                    &#xA;                    avcodec_parameters_to_context(outputCodecContext, outputStream->codecpar);&#xA;                }       &#xA;&#xA;                std::cout&lt;&lt;"Video Codec: resolution " &lt;&lt; pLocalCodecParameters->width &lt;&lt; " x "&lt;height&lt;codec_type == AVMEDIA_TYPE_AUDIO) {&#xA;                std::cout&lt;&lt;"Audio Codec: "&lt;channels&lt;&lt;" channels, sample rate "&lt;sample_rate&lt;name &lt;&lt; " ID: " &lt;id&lt;&lt; " bit_rate: "&lt;bit_rate&lt;/ outputStream->codecpar->codec_id = outputFormat->video_codec;&#xA;    // outputStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;    // outputStream->codecpar->width = 300;&#xA;    // outputStream->codecpar->height = 300;&#xA;    // outputStream->codecpar->format = AV_PIX_FMT_YUV420P;&#xA;    // outputStream->codecpar->bit_rate = 200 * 1000;&#xA;    outputCodecContext->time_base = (AVRational){ 1, 1 };&#xA;    outputCodecContext->max_b_frames = 2;&#xA;    outputCodecContext->gop_size = 12;&#xA;    outputCodecContext->framerate = (AVRational){ 30, 1 };&#xA;&#xA;    if (avcodec_parameters_to_context(pCodecContext, pCodecParameters) &lt; 0)&#xA;    {&#xA;        std::cerr&lt;&lt;"failed to copy codec params to codec context\n";&#xA;            return -1;&#xA;    }&#xA;&#xA;    // std::cout&lt;&lt;"pCodecContext->time_base: "&lt;time_base)&lt;/ outputCodecContext->time_base = pCodecContext->time_base;&#xA;    // outputCodecContext->max_b_frames = pCodecContext->max_b_frames;&#xA;    // outputCodecContext->gop_size = pCodecContext->gop_size;&#xA;    // outputCodecContext->framerate = pCodecContext->framerate;&#xA;&#xA;    if (outputStream->codecpar->codec_id == AV_CODEC_ID_H264) {&#xA;        // av_opt_set(pCodecContext, "preset", "ultrafast", 0);&#xA;        av_opt_set(outputCodecContext, "preset", "ultrafast", 0);&#xA;    }&#xA;    else if (outputStream->codecpar->codec_id == AV_CODEC_ID_H265)&#xA;    {&#xA;        // av_opt_set(pCodecContext, "preset", "ultrafast", 0);&#xA;        av_opt_set(outputCodecContext, "preset", "ultrafast", 0);&#xA;    }&#xA;&#xA;    // avcodec_parameters_from_context(stream->codecpar, pCodecContext);&#xA;    avcodec_parameters_from_context(outputStream->codecpar, outputCodecContext);&#xA;&#xA;    if (avcodec_open2(pCodecContext, pCodec, NULL) &lt; 0)&#xA;    {&#xA;        std::cerr&lt;&lt;"failed to open codec through avcodec_open2\n";&#xA;            return -1;&#xA;    }&#xA;&#xA;    if (avcodec_open2(outputCodecContext, outputCodec, NULL) &lt; 0)&#xA;    {&#xA;        std::cerr&lt;&lt;"failed to open output codec through avcodec_open2\n";&#xA;            return -1;&#xA;    }&#xA;&#xA;&#xA;    if (!(outputFormat->flags &amp; AVFMT_NOFILE)) {&#xA;        if (avio_open(&amp;outputFormatContext->pb, "test.mp4", AVIO_FLAG_WRITE) &lt; 0) {&#xA;            std::cout &lt;&lt; "Failed to open file" &lt;&lt; std::endl;&#xA;            return -1;&#xA;        }&#xA;    }&#xA;&#xA;    if (avformat_write_header(outputFormatContext, NULL) &lt; 0) {&#xA;        std::cout &lt;&lt; "Failed to write header" &lt;&lt; std::endl;&#xA;        return -1;&#xA;    }&#xA;&#xA;    av_dump_format(outputFormatContext, 0, "test.mp4", 1);&#xA;&#xA;&#xA;    AVFrame *pFrame = av_frame_alloc();&#xA;    if (!pFrame)&#xA;    {&#xA;        std::cerr&lt;&lt;"failed to allocate memory for AVFrame\n";&#xA;            return -1;&#xA;    }&#xA;    &#xA;    // https://ffmpeg.org/doxygen/trunk/structAVPacket.html&#xA;    AVPacket *pPacket = av_packet_alloc();&#xA;    if (!pPacket)&#xA;    {&#xA;            std::cerr&lt;&lt;"failed to allocate memory for AVPacket\n";&#xA;            return -1;&#xA;    }&#xA;&#xA;    int response = 0;&#xA;    int how_many_packets_to_process = 300;&#xA;&#xA;    // fill the Packet with data from the Stream&#xA;    // https://ffmpeg.org/doxygen/trunk/group__lavf__decoding.html#ga4fdb3084415a82e3810de6ee60e46a61&#xA;    while (av_read_frame(pFormatContext, pPacket) >= 0)&#xA;    {&#xA;            // if it&#x27;s the video stream&#xA;            if (pPacket->stream_index == video_stream_index) {&#xA;            std::cout&lt;&lt;"AVPacket->pts "&lt;pts;&#xA;                // if(av_write_frame(outputFormatContext, pPacket)&lt;0)&#xA;                //  std::cout&lt;&lt;"error writing output frame\n";&#xA;                // pushFrame(pFrame, outputCodecContext, pPacket, outputFormatContext, outputCodec);&#xA;                response = decode_packet(pPacket, pCodecContext, pFrame);&#xA;                if (response &lt; 0)&#xA;                    break;&#xA;                // stop it, otherwise we&#x27;ll be saving hundreds of frames&#xA;                if (--how_many_packets_to_process &lt;= 0) break;&#xA;            }&#xA;            // https://ffmpeg.org/doxygen/trunk/group__lavc__packet.html#ga63d5a489b419bd5d45cfd09091cbcbc2&#xA;            av_packet_unref(pPacket);&#xA;    }   &#xA;&#xA;    if(av_write_trailer(outputFormatContext)&lt;0)&#xA;        std::cout &lt;&lt;"Error writing output trailer\n";&#xA;&#xA;&#xA;    return 0;&#xA;}&#xA;&#xA;int save_frame_as_mpeg(AVCodecContext* pCodecCtx, AVFrame* pFrame, int FrameNo) {&#xA;    int ret = 0;&#xA;&#xA;    const AVCodec* mpegCodec = avcodec_find_encoder(pCodecCtx->codec_id);&#xA;    if (!mpegCodec) {&#xA;        std::cout&lt;&lt;"failed to open mpegCodec\n";&#xA;        return -1;&#xA;    }&#xA;    AVCodecContext* mpegContext = avcodec_alloc_context3(mpegCodec);&#xA;    if (!mpegContext) {&#xA;        std::cout&lt;&lt;"failed to open mpegContext\n";&#xA;        return -1;&#xA;    }&#xA;&#xA;    mpegContext->pix_fmt = pCodecCtx->pix_fmt;&#xA;    mpegContext->height = pFrame->height;&#xA;    mpegContext->width = pFrame->width;&#xA;    mpegContext->time_base = AVRational{ 1,10 };&#xA;&#xA;    ret = avcodec_open2(mpegContext, mpegCodec, NULL);&#xA;    if (ret &lt; 0) {&#xA;        return ret;&#xA;    }&#xA;    FILE* MPEGFile;&#xA;    char MPEGFName[256];&#xA;&#xA;    AVPacket packet;&#xA;    packet.data = NULL;&#xA;    packet.size = 0;&#xA;    av_init_packet(&amp;packet);&#xA;&#xA;    int gotFrame;&#xA;&#xA;    ret = avcodec_send_frame(mpegContext, pFrame);&#xA;    if (ret &lt; 0) {&#xA;        std::cout&lt;&lt;"failed to send frame for mpegContext\n";&#xA;        return ret;&#xA;    }&#xA;&#xA;    ret = avcodec_receive_packet(mpegContext, &amp;packet);&#xA;    if (ret &lt; 0) {&#xA;        std::cout&lt;&lt;"failed to receive packet for mpegContext\terrocode: "&lt;pix_fmt = pCodecCtx->pix_fmt;&#xA;    jpegContext->height = pFrame->height;&#xA;    jpegContext->width = pFrame->width;&#xA;    jpegContext->time_base = AVRational{ 1,10 };&#xA;&#xA;    ret = avcodec_open2(jpegContext, jpegCodec, NULL);&#xA;    if (ret &lt; 0) {&#xA;        return ret;&#xA;    }&#xA;    FILE* JPEGFile;&#xA;    char JPEGFName[256];&#xA;&#xA;    AVPacket packet;&#xA;    packet.data = NULL;&#xA;    packet.size = 0;&#xA;    av_init_packet(&amp;packet);&#xA;&#xA;    int gotFrame;&#xA;&#xA;    ret = avcodec_send_frame(jpegContext, pFrame);&#xA;    if (ret &lt; 0) {&#xA;        return ret;&#xA;    }&#xA;&#xA;    ret = avcodec_receive_packet(jpegContext, &amp;packet);&#xA;    if (ret &lt; 0) {&#xA;        return ret;&#xA;    }&#xA;&#xA;    sprintf(JPEGFName, "c:\\folder\\dvr-%06d.jpg", FrameNo);&#xA;    JPEGFile = fopen(JPEGFName, "wb");&#xA;    fwrite(packet.data, 1, packet.size, JPEGFile);&#xA;    fclose(JPEGFile);&#xA;&#xA;    av_packet_unref(&amp;packet);&#xA;    avcodec_close(jpegContext);&#xA;    return 0;&#xA;}&#xA;&#xA;static int decode_packet(AVPacket *pPacket, AVCodecContext *pCodecContext, AVFrame *pFrame)&#xA;{&#xA;  // Supply raw packet data as input to a decoder&#xA;  // https://ffmpeg.org/doxygen/trunk/group__lavc__decoding.html#ga58bc4bf1e0ac59e27362597e467efff3&#xA;  int response = avcodec_send_packet(pCodecContext, pPacket);&#xA;  if (response &lt; 0) {&#xA;      std::cerr&lt;&lt;"Error while sending a packet to the decoder: "&lt;= 0)&#xA;  {&#xA;    // Return decoded output data (into a frame) from a decoder&#xA;    // https://ffmpeg.org/doxygen/trunk/group__lavc__decoding.html#ga11e6542c4e66d3028668788a1a74217c&#xA;    response = avcodec_receive_frame(pCodecContext, pFrame);&#xA;    if (response == AVERROR(EAGAIN) || response == AVERROR_EOF) {&#xA;      break;&#xA;    } else if (response &lt; 0) {&#xA;        std::cerr&lt;&lt;"Error while receiving a frame from the decoder: "&lt;= 0) {&#xA;&#xA;      response = save_frame_as_jpeg(pCodecContext, pFrame, pCodecContext->frame_number);&#xA;&#xA;      if(response&lt;0)&#xA;      {&#xA;        std::cerr&lt;&lt;"Failed to save frame as jpeg\n";&#xA;        return -1;&#xA;      }&#xA;&#xA;      response = save_frame_as_mpeg(pCodecContext, pFrame, pCodecContext->frame_number);&#xA;&#xA;      if(response&lt;0)&#xA;      {&#xA;        std::cerr&lt;&lt;"Failed to save frame as mpeg\n";&#xA;        return -1;&#xA;      }&#xA;&#xA;&#xA;     std::cout&lt;&lt;&#xA;          "Frame "&lt;frame_number&lt;&lt; "type= "&lt;pict_type)&lt;&lt;" size= "&lt;pkt_size&lt;&lt;" bytes, format= "&lt;format&lt;&lt;" "&lt;pts&lt;&lt;"pts key_frame "&lt;key_frame&lt;&lt; " [DTS"&lt;coded_picture_number&lt;&lt;" ]\n";&#xA;      &#xA;      char frame_filename[1024];&#xA;      snprintf(frame_filename, sizeof(frame_filename), "%s-%d.pgm", "frame", pCodecContext->frame_number);&#xA;      // Check if the frame is a planar YUV 4:2:0, 12bpp&#xA;      // That is the format of the provided .mp4 file&#xA;      // RGB formats will definitely not give a gray image&#xA;      // Other YUV image may do so, but untested, so give a warning&#xA;      if (pFrame->format != AV_PIX_FMT_YUV420P)&#xA;      {&#xA;          std::cout&lt;&lt;"Warning: the generated file may not be a grayscale image, but could e.g. be just the R component if the video format is RGB\n";&#xA;      }&#xA;   &#xA;    }&#xA;  }&#xA;  return 0;&#xA;}&#xA;</thread></chrono></string></fstream>

    &#xA;

    The question that I am seeking an answer to is How can I use libavcodec to split an mp4 file into 1 second chunk clips (those clips will be in mp4 format) ?

    &#xA;

  • Streaming Anki Vector's camera

    25 novembre 2023, par Brendan Goode

    I am trying to stream my robot to Remo.tv with my Vector robot. The website recognizes I am going live but does not stream what the robots camera is seeing. I have confirmed the camera works by a local application that runs the SDK. The very end of the code is what is giving issues, it appears somebody ripped code from Cozmo and attempted to paste it into a Vector file. The problem is it seems like the camera is taking pictures and we reach the point where it attempts to send photo but fails ?

    &#xA;

    # This is a dummy file to allow the automatic loading of modules without error on none.&#xA;import anki_vector&#xA;import atexit&#xA;import time&#xA;import _thread as thread&#xA;import logging&#xA;import networking&#xA;&#xA;log = logging.getLogger(&#x27;RemoTV.vector&#x27;)&#xA;vector = None&#xA;reserve_control = None&#xA;robotKey = None&#xA;volume = 100 #this is stupid, but who cares&#xA;annotated = False&#xA;&#xA;def connect():&#xA;    global vector&#xA;    global reserve_control&#xA;&#xA;    log.debug("Connecting to Vector")&#xA;    vector = anki_vector.AsyncRobot()&#xA;    vector.connect()&#xA;    #reserve_control = anki_vector.behavior.ReserveBehaviorControl()&#xA;    &#xA;    atexit.register(exit)&#xA;&#xA;    return(vector)&#xA;&#xA;def exit():&#xA;    log.debug("Vector exiting")&#xA;    vector.disconnect()&#xA;    &#xA;def setup(robot_config):&#xA;    global forward_speed&#xA;    global turn_speed&#xA;    global volume&#xA;    global vector&#xA;    global charge_high&#xA;    global charge_low&#xA;    global stay_on_dock&#xA;&#xA;    global robotKey&#xA;    global server&#xA;    global no_mic&#xA;    global no_camera&#xA;    global ffmpeg_location&#xA;    global v4l2_ctl_location&#xA;    global x_res&#xA;    global y_res&#xA;    &#xA;    robotKey = robot_config.get(&#x27;robot&#x27;, &#x27;robot_key&#x27;)&#xA;&#xA;    if robot_config.has_option(&#x27;misc&#x27;, &#x27;video_server&#x27;):&#xA;        server = robot_config.get(&#x27;misc&#x27;, &#x27;video_server&#x27;)&#xA;    else:&#xA;        server = robot_config.get(&#x27;misc&#x27;, &#x27;server&#x27;)&#xA; &#xA;    no_mic = robot_config.getboolean(&#x27;camera&#x27;, &#x27;no_mic&#x27;)&#xA;    no_camera = robot_config.getboolean(&#x27;camera&#x27;, &#x27;no_camera&#x27;)&#xA;&#xA;    ffmpeg_location = robot_config.get(&#x27;ffmpeg&#x27;, &#x27;ffmpeg_location&#x27;)&#xA;    v4l2_ctl_location = robot_config.get(&#x27;ffmpeg&#x27;, &#x27;v4l2-ctl_location&#x27;)&#xA;&#xA;    x_res = robot_config.getint(&#x27;camera&#x27;, &#x27;x_res&#x27;)&#xA;    y_res = robot_config.getint(&#x27;camera&#x27;, &#x27;y_res&#x27;)&#xA;&#xA;&#xA;    if vector == None:&#xA;        vector = connect()&#xA;&#xA;    #x  mod_utils.repeat_task(30, check_battery, coz)&#xA;&#xA;    if robot_config.has_section(&#x27;cozmo&#x27;):&#xA;        forward_speed = robot_config.getint(&#x27;cozmo&#x27;, &#x27;forward_speed&#x27;)&#xA;        turn_speed = robot_config.getint(&#x27;cozmo&#x27;, &#x27;turn_speed&#x27;)&#xA;        volume = robot_config.getint(&#x27;cozmo&#x27;, &#x27;volume&#x27;)&#xA;        charge_high = robot_config.getfloat(&#x27;cozmo&#x27;, &#x27;charge_high&#x27;)&#xA;        charge_low = robot_config.getfloat(&#x27;cozmo&#x27;, &#x27;charge_low&#x27;)&#xA;        stay_on_dock = robot_config.getboolean(&#x27;cozmo&#x27;, &#x27;stay_on_dock&#x27;)&#xA;&#xA;#    if robot_config.getboolean(&#x27;tts&#x27;, &#x27;ext_chat&#x27;): #ext_chat enabled, add motor commands&#xA;#        extended_command.add_command(&#x27;.anim&#x27;, play_anim)&#xA;#        extended_command.add_command(&#x27;.forward_speed&#x27;, set_forward_speed)&#xA;#        extended_command.add_command(&#x27;.turn_speed&#x27;, set_turn_speed)&#xA;#        extended_command.add_command(&#x27;.vol&#x27;, set_volume)&#xA;#        extended_command.add_command(&#x27;.charge&#x27;, set_charging)&#xA;#        extended_command.add_command(&#x27;.stay&#x27;, set_stay_on_dock)&#xA;&#xA;    vector.audio.set_master_volume(volume) # set volume&#xA;&#xA;    return&#xA;    &#xA;def move(args):&#xA;    global charging&#xA;    global low_battery&#xA;    command = args[&#x27;button&#x27;][&#x27;command&#x27;]&#xA;&#xA;    try:&#xA;        if vector.status.is_on_charger and not charging:&#xA;            if low_battery:&#xA;                print("Started Charging")&#xA;                charging = 1&#xA;            else:&#xA;                if not stay_on_dock:&#xA;                    vector.drive_off_charger_contacts().wait_for_completed()&#xA;&#xA;        if command == &#x27;f&#x27;:&#xA;            vector.behavior.say_text("Moving {}".format(command))&#xA;&#xA;            #causes delays #coz.drive_straight(distance_mm(10), speed_mmps(50), False, True).wait_for_completed()&#xA;            vector.motors.set_wheel_motors(forward_speed, forward_speed, forward_speed*4, forward_speed*4 )&#xA;            time.sleep(0.7)&#xA;            vector.motors.set_wheel_motors(0, 0)&#xA;        elif command == &#x27;b&#x27;:&#xA;            #causes delays #coz.drive_straight(distance_mm(-10), speed_mmps(50), False, True).wait_for_completed()&#xA;            vector.motors.set_wheel_motors(-forward_speed, -forward_speed, -forward_speed*4, -forward_speed*4 )&#xA;            time.sleep(0.7)&#xA;            vector.motors.set_wheel_motors(0, 0)&#xA;        elif command == &#x27;l&#x27;:&#xA;            #causes delays #coz.turn_in_place(degrees(15), False).wait_for_completed()&#xA;            vector.motors.set_wheel_motors(-turn_speed, turn_speed, -turn_speed*4, turn_speed*4 )&#xA;            time.sleep(0.5)&#xA;            vector.motors.set_wheel_motors(0, 0)&#xA;        elif command == &#x27;r&#x27;:&#xA;            #causes delays #coz.turn_in_place(degrees(-15), False).wait_for_completed()&#xA;            vector.motors.set_wheel_motors(turn_speed, -turn_speed, turn_speed*4, -turn_speed*4 )&#xA;            time.sleep(0.5)&#xA;            vector.motors.set_wheel_motors(0, 0)&#xA;&#xA;        #move lift&#xA;        elif command == &#x27;w&#x27;:&#xA;            vector.behavior.say_text("w")&#xA;            vector.set_lift_height(height=1).wait_for_completed()&#xA;        elif command == &#x27;s&#x27;:&#xA;            vector.behavior.say_text("s")&#xA;            vector.set_lift_height(height=0).wait_for_completed()&#xA;&#xA;        #look up down&#xA;        #-25 (down) to 44.5 degrees (up)&#xA;        elif command == &#x27;q&#x27;:&#xA;            #head_angle_action = coz.set_head_angle(degrees(0))&#xA;            #clamped_head_angle = head_angle_action.angle.degrees&#xA;            #head_angle_action.wait_for_completed()&#xA;            vector.behaviour.set_head_angle(45)&#xA;            time.sleep(0.35)&#xA;            vector.behaviour.set_head_angle(0)&#xA;        elif command == &#x27;a&#x27;:&#xA;            #head_angle_action = coz.set_head_angle(degrees(44.5))&#xA;            #clamped_head_angle = head_angle_action.angle.degrees&#xA;            #head_angle_action.wait_for_completed()&#xA;            vector.behaviour.set_head_angle(-22.0)&#xA;            time.sleep(0.35)&#xA;            vector.behaviour.set_head_angle(0)&#xA;   &#xA;        #things to say with TTS disabled&#xA;        elif command == &#x27;sayhi&#x27;:&#xA;            tts.say( "hi! I&#x27;m cozmo!" )&#xA;        elif command == &#x27;saywatch&#x27;:&#xA;            tts.say( "watch this" )&#xA;        elif command == &#x27;saylove&#x27;:&#xA;            tts.say( "i love you" )&#xA;        elif command == &#x27;saybye&#x27;:&#xA;            tts.say( "bye" )&#xA;        elif command == &#x27;sayhappy&#x27;:&#xA;            tts.say( "I&#x27;m happy" )&#xA;        elif command == &#x27;saysad&#x27;:&#xA;            tts.say( "I&#x27;m sad" )&#xA;        elif command == &#x27;sayhowru&#x27;:&#xA;            tts.say( "how are you?" )&#xA;    except:&#xA;        return(False)&#xA;    return&#xA;&#xA;def start():&#xA;    log.debug("Starting Vector Video Process")&#xA;    try:&#xA;        thread.start_new_thread(video, ())&#xA;    except KeyboardInterrupt as e:&#xA;        pass        &#xA;    return&#xA;    &#xA;def video():&#xA;    global vector&#xA;    # Turn on image receiving by the camera&#xA;    vector.camera.init_camera_feed()&#xA;&#xA;    vector.behavior.say_text("hey everyone, lets robot!")&#xA;&#xA;    while True:&#xA;        time.sleep(0.25)&#xA;&#xA;        from subprocess import Popen, PIPE&#xA;        from sys import platform&#xA;&#xA;        log.debug("ffmpeg location : {}".format(ffmpeg_location))&#xA;&#xA;#        import os&#xA;#        if not os.path.isfile(ffmpeg_location):&#xA;#        print("Error: cannot find " &#x2B; str(ffmpeg_location) &#x2B; " check ffmpeg is installed. Terminating controller")&#xA;#        thread.interrupt_main()&#xA;#        thread.exit()&#xA;&#xA;        while not networking.authenticated:&#xA;            time.sleep(1)&#xA;&#xA;        p = Popen([ffmpeg_location, &#x27;-y&#x27;, &#x27;-f&#x27;, &#x27;image2pipe&#x27;, &#x27;-vcodec&#x27;, &#x27;png&#x27;, &#x27;-r&#x27;, &#x27;25&#x27;, &#x27;-i&#x27;, &#x27;-&#x27;, &#x27;-vcodec&#x27;, &#x27;mpeg1video&#x27;, &#x27;-r&#x27;, &#x27;25&#x27;, "-f", "mpegts", "-headers", "\"Authorization: Bearer {}\"".format(robotKey), "http://{}:1567/transmit?name={}-video".format(server, networking.channel_id)], stdin=PIPE)&#xA;        #p = Popen([ffmpeg_location, &#x27;-nostats&#x27;, &#x27;-y&#x27;, &#x27;-f&#x27;, &#x27;image2pipe&#x27;, &#x27;-vcodec&#x27;, &#x27;png&#x27;, &#x27;-r&#x27;, &#x27;25&#x27;, &#x27;-i&#x27;, &#x27;-&#x27;, &#x27;-vcodec&#x27;, &#x27;mpeg1video&#x27;, &#x27;-r&#x27;, &#x27;25&#x27;,&#x27;-b:v&#x27;, &#x27;400k&#x27;, "-f","mpegts", "-headers", "\"Authorization: Bearer {}\"".format(robotKey), "http://{}/transmit?name=rbot-390ddbe0-f1cc-4710-b3f1-9f477f4875f9-video".format(server)], stdin=PIPE)&#xA;        #p = Popen([ffmpeg_location, &#x27;-y&#x27;, &#x27;-f&#x27;, &#x27;image2pipe&#x27;, &#x27;-vcodec&#x27;, &#x27;png&#x27;, &#x27;-r&#x27;, &#x27;25&#x27;, &#x27;-i&#x27;, &#x27;-&#x27;, &#x27;-vcodec&#x27;, &#x27;mpeg1video&#x27;, &#x27;-r&#x27;, &#x27;25&#x27;, "-f", "mpegts", "-headers", "\"Authorization: Bearer {}\"".format(robotKey), "http://{}/transmit?name=rbot-390ddbe0-f1cc-4710-b3f1-9f477f4875f9-video".format(server, networking.channel_id)], stdin=PIPE)&#xA;        print(vector)&#xA;        image = vector.camera.latest_image&#xA;        image.raw_image.save("test.png", &#x27;PNG&#x27;)&#xA;        try:&#xA;            while True:&#xA;                if vector:&#xA;                    image = vector.camera.latest_image&#xA;                    if image:&#xA;                        if annotated:&#xA;                            image = image.annotate_image()&#xA;                        else:&#xA;                            image = image.raw_image&#xA;                        print("attempting to write image")&#xA;                        image.save(p.stdin, &#x27;PNG&#x27;)&#xA;&#xA;                else:&#xA;                    time.sleep(.1)&#xA;            log.debug("Lost Vector object, terminating video stream")&#xA;            p.stdin.close()&#xA;            p.wait()&#xA;        except Exception as e:&#xA;            log.debug("Vector Video Exception! {}".format(e))&#xA;            p.stdin.close()&#xA;            p.wait()&#xA;            pass               &#xA;    &#xA;

    &#xA;

    Here is the error we get

    &#xA;

    [vost#0:0/mpeg1video @ 000001c7153c1cc0] Error submitting a packet to the muxer: Error number -10053 occurred&#xA;[out#0/mpegts @ 000001c713448480] Error muxing a packet&#xA;[out#0/mpegts @ 000001c713448480] Error writing trailer: Error number -10053 occurred&#xA;[http @ 000001c7134cab00] URL read error: Error number -10053 occurred&#xA;[out#0/mpegts @ 000001c713448480] Error closing file: Error number -10053 occurred&#xA;[out#0/mpegts @ 000001c713448480] video:56kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown&#xA;frame=   25 fps=0.0 q=2.0 Lsize=      53kB time=00:00:01.32 bitrate= 325.9kbits/s speed=7.05x&#xA;Conversion failed!&#xA;&#xA;attempting to write image&#xA;

    &#xA;

    You can see our attempts to fix by commented out code in the #p section at the bottom.

    &#xA;