Recherche avancée

Médias (0)

Mot : - Tags -/clipboard

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

Autres articles (93)

  • Organiser par catégorie

    17 mai 2013, par

    Dans MédiaSPIP, une rubrique a 2 noms : catégorie et rubrique.
    Les différents documents stockés dans MédiaSPIP peuvent être rangés dans différentes catégories. On peut créer une catégorie en cliquant sur "publier une catégorie" dans le menu publier en haut à droite ( après authentification ). Une catégorie peut être rangée dans une autre catégorie aussi ce qui fait qu’on peut construire une arborescence de catégories.
    Lors de la publication prochaine d’un document, la nouvelle catégorie créée sera proposée (...)

  • Les sons

    15 mai 2013, par
  • Soumettre bugs et patchs

    10 avril 2011

    Un logiciel n’est malheureusement jamais parfait...
    Si vous pensez avoir mis la main sur un bug, reportez le dans notre système de tickets en prenant bien soin de nous remonter certaines informations pertinentes : le type de navigateur et sa version exacte avec lequel vous avez l’anomalie ; une explication la plus précise possible du problème rencontré ; si possibles les étapes pour reproduire le problème ; un lien vers le site / la page en question ;
    Si vous pensez avoir résolu vous même le bug (...)

Sur d’autres sites (2873)

  • Linear Attribution Model : What Is It and How Does It Work ?

    16 février 2024, par Erin

    Want a more in-depth way to understand the effectiveness of your marketing campaigns ? Then, the linear attribution model could be the answer.

    Although you can choose from several different attribution models, a linear model is ideal for giving value to every touchpoint along the customer journey. It can help you identify your most effective marketing channels and optimise your campaigns. 

    So, without further ado, let’s explore what a linear attribution model is, when you should use it and how you can get started. 

    What is a linear attribution model ?

    A linear attribution model is a multi-touch method of marketing attribution where equal credit is given to each touchpoint. Every marketing channel used across the entire customer journey gets credit, and each is considered equally important. 

    So, if a potential customer has four interactions before converting, each channel gets 25% of the credit.

    The linear attribution model shares credit equally between each touchpoint

    Let’s look at how linear attribution works in practice using a hypothetical example of a marketing manager, Sally, who is looking for an alternative to Google Analytics. 

    Sally starts her conversion path by reading a Matomo article comparing Matomo to Google Analytics she finds when searching on Google. A few days later she signs up for a webinar she saw on Matomo’s LinkedIn page. Two weeks later, Sally gets a sign-off from her boss and decides to go ahead with Matomo. She visits the website and starts a free trial by clicking on one of the paid Google Ads. 

    Using a linear attribution model, we credit each of the channels Sally uses (organic traffic, organic social, and paid ads), ensuring no channel is overlooked in our marketing analysis. 

    Are there other types of attribution models ?

    Absolutely. There are several common types of attribution models marketing managers can use to measure the impact of channels in different ways. 

    Pros & Cons of Different Marketing Attribution Models
    • First interaction : Also called a first-touch attribution model, this method gives all the credit to the first channel in the customer journey. This model is great for optimising the top of your sales funnel.
    • Last interaction : Also called a last-touch attribution model, this approach gives all the credit to the last channel the customer interacts with. It’s a great model for optimising the bottom of your marketing funnel. 
    • Last non-direct interaction : This attribution model excludes direct traffic and credits the previous touchpoint. This is a fantastic alternative to a last-touch attribution model, especially if most customers visit your website before converting. 
    • Time decay attribution model : This model adjusts credit according to the order of the touchpoints. Those nearest the conversion get weighted the highest. 
    • Position-based attribution model : This model allocates 40% of the credit to the first and last touchpoints and splits the remaining 20% evenly between every other interaction.

    Why use a linear attribution model ?

    Marketing attribution is vital if you want to understand which parts of your marketing strategy are working. All of the attribution models described above can help you achieve this to some degree, but there are several reasons to choose a linear attribution model in particular. 

    It uses multi-touch attribution

    Unlike single-touch attribution models like first and last interaction, linear attribution is a multi-touch attribution model that considers every touchpoint. This is vital to get a complete picture of the modern customer journey, where customers interact with companies between 20 and 500 times

    Single-touch attribution models can be misleading by giving conversion credit to a single channel, especially if it was the customer’s last use. In our example above, Sally’s last interaction with our brand was through a paid ad, but it was hardly the most important. 

    It’s easy to understand

    Attribution models can be complicated, but linear attribution is easy to understand. Every touchpoint gets the same credit, allowing you to see how your entire marketing function works. This simplicity also makes it easy for marketers to take action. 

    It’s great for identifying effective marketing channels

    Because linear attribution is one of the few models that provides a complete view of the customer journey, it’s easy to identify your most common and influential touchpoints. 

    It accounts for the top and bottom of your funnel, so you can also categorise your marketing channels more effectively and make more informed decisions. For example, PPC ads may be a more common bottom-of-the-full touchpoint and should, therefore, not be used to target broad, top-of-funnel search terms.

    Are there any reasons not to use linear attribution ?

    Linear attribution isn’t perfect. Like all attribution models, it has its weaknesses. Specifically, linear attribution can be too simple, dilute conversion credit and unsuitable for long sales cycles.

    What are the reasons not to use linear attribution

    It can be too simple

    Linear attribution lacks nuance. It only considers touchpoints while ignoring other factors like brand image and your competitors. This is true for most attribution models, but it’s still important to point it out. 

    It can dilute conversion credit

    In reality, not every touchpoint impacts conversions to the same extent. In the example above, the social media post promoting the webinar may have been the most effective touchpoint, but we have no way of measuring this. 

    The risk with using a linear model is that credit can be underestimated and overestimated — especially if you have a long sales cycle. 

    It’s unsuitable for very long sales cycles

    Speaking of long sales cycles, linear attribution models won’t add much value if your customer journey contains dozens of different touchpoints. Credit will get diluted to the point where analysis becomes impossible, and the model will also struggle to measure the precise ways certain touchpoints impact conversions. 

    Should you use a linear attribution model ?

    A linear attribution model is a great choice for any company with shorter sales cycles or a reasonably straightforward customer journey that uses multiple marketing channels. In these cases, it helps you understand the contribution of each touchpoint and find your best channels. 

    It’s also a practical choice for small businesses and startups that don’t have a team of data scientists on staff or the budget to hire outside help. Because it’s so easy to set up and understand, anyone can start generating insights using this model. 

    How to set up a linear attribution model

    Are you sold on the idea of using a linear attribution model ? Then follow the steps below to get started :

    Set up marketing attribution in four steps

    Choose a marketing attribution tool

    Given the market is worth $3.1 billion, you won’t be surprised to learn there are plenty of tools to choose from. But choose carefully. The tool you pick can significantly impact your success with attribution modelling. 

    Take Google Analytics, for instance. While GA4 offers several marketing attribution models for free, including linear attribution, it lacks accuracy due to cookie consent rejection and data sampling. 

    Accurate marketing attribution is included as a feature in Matomo Cloud and is available as a plugin for Matomo On-Premise users. We support a full range of attribution models that use 100% accurate data because we don’t use data sampling, and cookie consent isn’t an issue (with the exception of Germany and the UK). That means you can trust our insights.

    Matomo’s marketing attribution is available out of the box, and we also provide access to raw data, allowing you to develop your custom attribution model. 

    Collect data

    The quality of your marketing attribution also depends on the quality and quantity of your data. It’s why you need to avoid a platform that uses data sampling. 

    This should include :

    • General data from your analytics platform, like pages visited and forms filled
    • Goals and conversions, which we’ll discuss in more detail in the next step
    • Campaign tracking data so you can monitor the behaviour of traffic from different referral channels
    • Behavioural data from features like Heatmaps or Session Recordings

    Set up goals and conversions

    You can’t assign conversion values to customer journey touchpoints if you don’t have conversion goals in place. That’s why the next step of the process is to set up conversion tracking in your web analytics platform. 

    Depending on your type of business and the product you sell, conversions could take one of the following forms :

    • A product purchase
    • Signing up for a webinar
    • Downloading an ebook
    • Filling in a form
    • Starting a free trial

    Setting up these kinds of goals is easy if you use Matomo. 

    Just head to the Goals section of the dashboard, click Manage Goals and then click the green Add A New Goal button. 

    Fill in the screen below, and add a Goal Revenue at the bottom of the page. Doing so will mean Matomo can automatically calculate the value of each touchpoint when using your attribution model. 

    A screenshot of Matomo's conversion dashboard

    If your analytics platform allows it, make sure you also set up Event Tracking, which will allow you to analyse how many users start to take a desired action (like filling in a form) but never complete the task. 

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    Test and validate

    As we’ve explained, linear attribution is a great model in some scenarios, but it can fall short if you have a long or complex sales funnel. Even if you’re sure it’s the right model for your company, testing and validating is important. 

    Ideally, your chosen attribution tool should make this process pretty straightforward. For example, Matomo’s Marketing Attribution feature makes comparing and contrasting three different attribution models easy. 

    Here we compare the performance of three attribution models—linear, first-touch, and last-non-direct—in Matomo’s Marketing Attribution dashboard, providing straightforward analysis.

    If you think linear attribution accurately reflects the value of your channels, you can start to analyse the insights it generates. If not, then consider using another attribution model.

    Don’t forget to take action from your marketing efforts, either. Linear attribution helps you spot the channels that contribute most to conversions, so allocate more resources to those channels and see if you can improve your conversion rate or boost your ROI. 

    Make the most of marketing attribution with Matomo

    A linear attribution model lets you measure every touchpoint in your customer journey. It’s an easy attribution model to start with and lets you identify and optimise your most effective marketing channels. 

    However, accurate data is essential if you want to benefit the most from marketing attribution data. If your web analytics solution doesn’t play nicely with cookies or uses sampled data, then your linear model isn’t going to tell you the whole story. 

    That’s why over 1 million sites trust Matomo’s privacy-focused web analytics, ensuring accurate data for a comprehensive understanding of customer journeys.

    Now you know what linear attribution modelling is, start employing the model today by signing up for a free 21-day trial, no credit card required. 

  • FFmpeg Concatenation Command Fails in Flutter App

    18 février 2024, par Petro

    I'm developing a Flutter application where I need to concatenate several images into a single video file using FFmpeg. Despite following the recommended practices and trying multiple variations of the FFmpeg command, all my attempts result in failure with an exit code of 1.

    


    FFMPEG Version : ffmpeg_kit_flutter: ^6.0.3-LTS

    


    All of the files are present when this happens...
enter image description here

    


    Environment :
Flutter app targeting Android
Using ffmpeg-kit-flutter for FFmpeg operations

    


    Objective :
To concatenate multiple images stored in the app's file system into a video.

    


    Code Snippet :
I'm generating a list of image paths, writing them to a file (ffmpeg_list.txt), and using that file with FFmpeg's concat demuxer. Here's a simplified version of my code :

    


    Future<void> _createVideoFromImages() async {&#xA;  final Directory appDir = await getApplicationDocumentsDirectory();&#xA;  final Uuid uuid = Uuid();&#xA;  final String videoFileName = uuid.v4();&#xA;  final String outputPath = &#x27;${appDir.path}/$videoFileName.mp4&#x27;;&#xA;  &#xA;  final Directory tempImageDir = await Directory(&#x27;${appDir.path}/tempImages&#x27;).create();&#xA;  final StringBuffer ffmpegInput = StringBuffer();&#xA;  int index = 0;&#xA;&#xA;  for (var image in _images) {&#xA;    String newFileName = &#x27;img${index&#x2B;&#x2B;}${Path.extension(image.path)}&#x27;.replaceAll(&#x27; &#x27;, &#x27;_&#x27;);&#xA;    final String newPath = &#x27;${tempImageDir.path}/$newFileName&#x27;;&#xA;    await image.copy(newPath);&#xA;    ffmpegInput.writeln("file &#x27;$newPath&#x27;");&#xA;  }&#xA;&#xA;  final String listFilePath = &#x27;${appDir.path}/ffmpeg_list.txt&#x27;;&#xA;  await File(listFilePath).writeAsString(ffmpegInput.toString());&#xA;&#xA;  if(await File(listFilePath).exists()) {&#xA;    String ffmpegCommand = "-v verbose -f concat -safe 0 -i $listFilePath -vsync vfr -pix_fmt yuv420p -c:v libx264 -r 30 $outputPath";&#xA;    // Additional commands tried here...&#xA;    await FFmpegKit.execute(ffmpegCommand).then((session) async {&#xA;      // Error handling code...&#xA;    });&#xA;  }&#xA;}&#xA;&#xA;Result Logs:&#xA;I/flutter: file exists at /data/user/0/com.example.app/app_flutter/ffmpeg_list.txt&#xA;I/flutter: FFmpeg command: -v verbose -f concat -safe 0 -i /data/user/0/com.example.app/app_flutter/ffmpeg_list.txt -vsync vfr -pix_fmt yuv420p -c:v libx264 -r 30 /data/user/0/com.example.app/app_flutter/58fdf92b-47b0-49d1-be93-d9c95870c733.mp4&#xA;I/flutter: Failed to create video&#xA;I/flutter: FFmpeg process exited with:1&#xA;I/flutter: FFmpeg command failed with logs: ffmpeg version n6.0 Copyright (c) 2000-2023 the FFmpeg developers...&#xA;</void>

    &#xA;

    Attempts :&#xA;-Simplified the FFmpeg command by removing -vsync vfr, -pix_fmt yuv420p, and adjusting -r 30 parameters.&#xA;-Tried using the -c copy option to avoid re-encoding.&#xA;-Tested with a single image to ensure basic functionality works.&#xA;-Checked file permissions and ensured all images and the list file are accessible.

    &#xA;

    Despite these attempts, the command fails without providing specific error messages related to the command's execution. The verbose logs do not offer insights beyond the FFmpeg version and configuration.

    &#xA;

    Questions :&#xA;Are there known issues with FFmpeg's concat that might lead to such failures ?&#xA;Are there alternative approaches ?

    &#xA;

    I appreciate any insights or suggestions the community might have. Thank you !

    &#xA;

    Full code :

    &#xA;

    Future<void> _createVideoFromImages() async {&#xA;    final Directory appDir = await getApplicationDocumentsDirectory();&#xA;    final Uuid uuid = Uuid();&#xA;    final String videoFileName = uuid.v4();&#xA;    final String outputPath = &#x27;${appDir.path}/$videoFileName.mp4&#x27;;&#xA;    final String singleImagePath = _images[0]!.path;&#xA;&#xA;// Create a directory to store renamed images to avoid any naming conflict&#xA;    final Directory tempImageDir = await Directory(&#x27;${appDir.path}/tempImages&#x27;).create();&#xA;&#xA;    final StringBuffer ffmpegInput = StringBuffer();&#xA;    int index = 0; // To ensure unique filenames&#xA;&#xA;    for (var image in _images) {&#xA;      // Generate a new filename by replacing spaces with underscores and adding an index&#xA;      String newFileName = &#x27;img${index&#x2B;&#x2B;}${p.extension(image!.path)}&#x27;.replaceAll(&#x27; &#x27;, &#x27;_&#x27;);&#xA;      final String newPath = &#x27;${tempImageDir.path}/$newFileName&#x27;;&#xA;&#xA;      // Copy and rename the original file to the new path&#xA;      await image!.copy(newPath);&#xA;&#xA;      // Add the new, safely named file path to the ffmpegInput&#xA;      ffmpegInput.writeln("file &#x27;$newPath&#x27;");&#xA;    }&#xA;&#xA;// Write the paths to a temporary text file for FFmpeg&#x27;s concat demuxer&#xA;    final String listFilePath = &#x27;${appDir.path}/ffmpeg_list.txt&#x27;;&#xA;    await File(listFilePath).writeAsString(ffmpegInput.toString());&#xA;&#xA;    //check if file exists&#xA;    if(await File(listFilePath).exists()) {&#xA;      print("file exists at $listFilePath");&#xA;&#xA;// Use the generated list file in the concat command&#xA;      String ffmpegCommand = "-v verbose -f concat -safe 0 -i $listFilePath -vsync vfr -pix_fmt yuv420p -c:v libx264 -r 30 $outputPath";&#xA;      String ffmpegCommand2 = "-v verbose -f concat -safe 0 -i $listFilePath -c:v libx264 $outputPath";&#xA;      String ffmpegCommand3 = "-v verbose -i $singleImagePath -frames:v 1 $outputPath";&#xA;      //print command&#xA;      print("FFmpeg command: $ffmpegCommand");&#xA;&#xA;&#xA;      await FFmpegKit.execute(ffmpegCommand).then((session) async {&#xA;        // Check the session for success or failure&#xA;        final returnCode = await session.getReturnCode();&#xA;        if (returnCode!.isValueSuccess()) {&#xA;          print("Video created successfully: $outputPath");&#xA;          //okay all set, now set the video to be this:&#xA;          _actual_video_file_ready_to_upload = File(outputPath);&#xA;          print ("video path is: ${outputPath}");&#xA;        } else {&#xA;          print("Failed to create video");&#xA;          print("FFmpeg process exited with:" &#x2B; returnCode.toString());&#xA;          // Command failed; capture and log error details&#xA;          await session.getLogsAsString().then((logs) {&#xA;            print("FFmpeg command failed with logs: $logs");&#xA;          });&#xA;          // Handle failure, e.g., by showing an error message&#xA;          showSnackBarHelperERRORWrapLongString(context, "Failed to create video");&#xA;        }&#xA;      });&#xA;&#xA;      //try command 2&#xA;      if(_actual_video_file_ready_to_upload == null) {&#xA;        await FFmpegKit.execute(ffmpegCommand2).then((session) async {&#xA;          // Check the session for success or failure&#xA;          final returnCode = await session.getReturnCode();&#xA;          if (returnCode!.isValueSuccess()) {&#xA;            print("Video created successfully: $outputPath");&#xA;            //okay all set, now set the video to be this:&#xA;            _actual_video_file_ready_to_upload = File(outputPath);&#xA;            print ("video path is: ${outputPath}");&#xA;          } else {&#xA;            print("Failed to create video");&#xA;            print("FFmpeg process exited with:" &#x2B; returnCode.toString());&#xA;            // Command failed; capture and log error details&#xA;            await session.getLogsAsString().then((logs) {&#xA;              print("FFmpeg command failed with logs: $logs");&#xA;            });&#xA;            // Handle failure, e.g., by showing an error message&#xA;            showSnackBarHelperERRORWrapLongString(context, "Failed to create video");&#xA;          }&#xA;        });&#xA;      }&#xA;      //try command 3&#xA;      if(_actual_video_file_ready_to_upload == null) {&#xA;        await FFmpegKit.execute(ffmpegCommand3).then((session) async {&#xA;          // Check the session for success or failure&#xA;          final returnCode = await session.getReturnCode();&#xA;          if (returnCode!.isValueSuccess()) {&#xA;            print("Video created successfully: $outputPath");&#xA;            //okay all set, now set the video to be this:&#xA;            _actual_video_file_ready_to_upload = File(outputPath);&#xA;            print ("video path is: ${outputPath}");&#xA;          } else {&#xA;            print("Failed to create video");&#xA;            print("FFmpeg process exited with:" &#x2B; returnCode.toString());&#xA;            // Command failed; capture and log error details&#xA;            await session.getLogsAsString().then((logs) {&#xA;              print("FFmpeg command failed with logs: $logs");&#xA;            });&#xA;            // Handle failure, e.g., by showing an error message&#xA;            showSnackBarHelperERRORWrapLongString(context, "Failed to create video");&#xA;          }&#xA;        });&#xA;      }&#xA;    }else{&#xA;      print("file does not exist at $listFilePath");&#xA;    }&#xA;  }&#xA;</void>

    &#xA;

  • How to record frames with ffmpeg and finish the recording

    20 février 2024, par Jorge Augusto Wilchen

    In the following code, i trying to create a class to record frames from an IP camera (RTSP), save frames on a .avi file and finish the record, but, when i kill the operation, the video file may be corrupted. Have any other more safely way to stop the ffmpeg recording ?

    &#xA;

    .cpp file :

    &#xA;

    #include "videorecorder.h"&#xA;&#xA;&#xA;VideoRecorder::VideoRecorder(const std::string&amp; rtspUrl) :&#xA;    url(rtspUrl),&#xA;    recording(false)&#xA;{&#xA;&#xA;}&#xA;&#xA;VideoRecorder::~VideoRecorder()&#xA;{&#xA;    end_record();&#xA;}&#xA;&#xA;bool VideoRecorder::start_record(const std::string &amp;fileName)&#xA;{&#xA;    if (recording) {&#xA;        std::cerr &lt;&lt; "Already recording." &lt;&lt; std::endl;&#xA;        return false;&#xA;    }&#xA;&#xA;    std::string command = "ffmpeg -rtsp_transport udp -i " &#x2B; url&#xA;                          &#x2B; " -c:v mjpeg -preset fast -qp 0 " &#x2B; fileName;&#xA;&#xA;    videoWriter = popen(command.c_str(), "w");&#xA;    if (!videoWriter) {&#xA;        std::cerr &lt;&lt; "Error opening ffmpeg process." &lt;&lt; std::endl;&#xA;        return false;&#xA;    }&#xA;&#xA;    recording = true;&#xA;    ffmpegProcessId = getpid();&#xA;    std::cout &lt;&lt; "Recording started." &lt;&lt; std::endl;&#xA;    return true;&#xA;}&#xA;&#xA;bool VideoRecorder::end_record()&#xA;{&#xA;    if (recording) {&#xA;        if (videoWriter) {&#xA;            pid_t ffmpegPID = fileno(videoWriter);&#xA;&#xA;            if (kill(ffmpegPID, SIGTERM) == 0) {&#xA;                std::cout &lt;&lt; "Recording terminated successfully." &lt;&lt; std::endl;&#xA;            } else {&#xA;                std::cerr &lt;&lt; "Error terminating recording." &lt;&lt; std::endl;&#xA;                return false;&#xA;            }&#xA;&#xA;            int status = pclose(videoWriter);&#xA;&#xA;            if (status == 0) {&#xA;                std::cout &lt;&lt; "Recording ended successfully." &lt;&lt; std::endl;&#xA;            } else {&#xA;                std::cerr &lt;&lt; "Error ending recording. pclose status: " &lt;&lt; status &lt;&lt; std::endl;&#xA;                return false;&#xA;            }&#xA;        } else {&#xA;            std::cerr &lt;&lt; "Error ending recording. videoWriter is nullptr." &lt;&lt; std::endl;&#xA;            return false;&#xA;        }&#xA;&#xA;        recording = false;&#xA;        return true;&#xA;    }&#xA;&#xA;    return false;&#xA;}&#xA;

    &#xA;

    .h file :

    &#xA;

    #ifndef VIDEORECORDER_H&#xA;#define VIDEORECORDER_H&#xA;&#xA;#include <string>&#xA;#include <iostream>&#xA;#include <fstream>&#xA;#include <cstdlib>&#xA;#include <csignal>&#xA;#include <sys></sys>wait.h>&#xA;&#xA;extern "C" {&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libavutil></libavutil>avutil.h>&#xA;#include <libavutil></libavutil>opt.h>&#xA;#include <libswscale></libswscale>swscale.h>&#xA;#include &#xA;}&#xA;&#xA;#include <linux></linux>videodev2.h>&#xA;&#xA;#include <opencv2></opencv2>opencv.hpp>&#xA;#include <opencv2></opencv2>videoio.hpp>&#xA;#include <opencv2></opencv2>highgui/highgui.hpp>&#xA;&#xA;&#xA;class VideoRecorder&#xA;{&#xA;public:&#xA;    VideoRecorder(const std::string&amp; rtspUrl);&#xA;    ~VideoRecorder();&#xA;    bool start_record(const std::string&amp; fileName);&#xA;    bool end_record();&#xA;&#xA;private:&#xA;    std::string url;&#xA;    AVFormatContext *formatContext;&#xA;    AVStream *videoStream;&#xA;    AVCodecContext *codecContext;&#xA;    AVCodec *codec;&#xA;    SwsContext *swsContext;&#xA;    AVFrame *frame;&#xA;    AVPacket packet;&#xA;    bool recording;&#xA;    pid_t ffmpegProcessId;&#xA;    FILE* videoWriter;&#xA;};&#xA;&#xA;#endif // VIDEORECORDER_H&#xA;</csignal></cstdlib></fstream></iostream></string>

    &#xA;

    I'm using the ffmpeg lib becouse i need max speed on frames recording, and OpenCV and AV Lib is much slowness than ffmpeg.

    &#xA;

    This my terminal output after recording during 10 seconds (generated a file with 23 seconds duration) :

    &#xA;

    Recording started.&#xA;ffmpeg version 4.3.6-0&#x2B;deb11u1&#x2B;rpt5 Copyright (c) 2000-2023 the FFmpeg developers&#xA;  built with gcc 10 (Debian 10.2.1-6)&#xA;  configuration: --prefix=/usr --extra-version=0&#x2B;deb11u1&#x2B;rpt5 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-mmal --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-sand --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared&#xA;  libavutil      56. 51.100 / 56. 51.100&#xA;  libavcodec     58. 91.100 / 58. 91.100&#xA;  libavformat    58. 45.100 / 58. 45.100&#xA;  libavdevice    58. 10.100 / 58. 10.100&#xA;  libavfilter     7. 85.100 /  7. 85.100&#xA;  libavresample   4.  0.  0 /  4.  0.  0&#xA;  libswscale      5.  7.100 /  5.  7.100&#xA;  libswresample   3.  7.100 /  3.  7.100&#xA;  libpostproc    55.  7.100 / 55.  7.100&#xA;Input #0, rtsp, from &#x27;rtsp://admin:[password]@[ip]:[port]/live/0/MAIN&#x27;:&#xA;  Metadata:&#xA;    title           : RTSP Server&#xA;  Duration: N/A, start: 0.280000, bitrate: N/A&#xA;    Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt709, progressive), 1920x1080, 25 fps, 25 tbr, 90k tbn, 50 tbc&#xA;Codec AVOption preset (Configuration preset) specified for output file #0 (/home/guardian-tech/Pictures/output_frame.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.&#xA;Codec AVOption qp (Constant quantization parameter rate control method) specified for output file #0 (/home/guardian-tech/Pictures/output_frame.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.&#xA;Stream mapping:&#xA;  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))&#xA;Press [q] to stop, [?] for help&#xA;Output #0, avi, to &#x27;/home/guardian-tech/Pictures/output_frame.avi&#x27;:&#xA;  Metadata:&#xA;    INAM            : RTSP Server&#xA;    ISFT            : Lavf58.45.100&#xA;    Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj420p(pc), 1920x1080, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc&#xA;    Metadata:&#xA;      encoder         : Lavc58.91.100 mjpeg&#xA;    Side data:&#xA;      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A&#xA;[rtsp @ 0x5592e7bb00] max delay reached. need to consume packet&#xA;[rtsp @ 0x5592e7bb00] RTP: missed 212 packets&#xA;[h264 @ 0x5592ebb790] concealing 2192 DC, 2192 AC, 2192 MV errors in I frame&#xA;rtsp://admin:[password]@[ip]:[port]/live/0/MAIN: corrupt decoded frame in stream 0&#xA;[rtsp @ 0x5592e7bb00] max delay reached. need to consume packet&#xA;[rtsp @ 0x5592e7bb00] RTP: missed 6 packets&#xA;[rtsp @ 0x5592e7bb00] max delay reached. need to consume packet&#xA;[rtsp @ 0x5592e7bb00] RTP: missed 14 packets&#xA;[h264 @ 0x5592f1bd30] cabac decode of qscale diff failed at 42 29&#xA;[h264 @ 0x5592f1bd30] error while decoding MB 42 29, bytestream 0&#xA;[h264 @ 0x5592f1bd30] concealing 4687 DC, 4687 AC, 4687 MV errors in I frame&#xA;rtsp://admin:[password]@[ip]:[port]/live/0/MAIN: corrupt decoded frame in stream 0&#xA;Error terminating recording.&#xA;

    &#xA;