
Recherche avancée
Médias (29)
-
#7 Ambience
16 octobre 2011, par
Mis à jour : Juin 2015
Langue : English
Type : Audio
-
#6 Teaser Music
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#5 End Title
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#3 The Safest Place
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#4 Emo Creates
15 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#2 Typewriter Dance
15 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
Autres articles (43)
-
La file d’attente de SPIPmotion
28 novembre 2010, parUne file d’attente stockée dans la base de donnée
Lors de son installation, SPIPmotion crée une nouvelle table dans la base de donnée intitulée spip_spipmotion_attentes.
Cette nouvelle table est constituée des champs suivants : id_spipmotion_attente, l’identifiant numérique unique de la tâche à traiter ; id_document, l’identifiant numérique du document original à encoder ; id_objet l’identifiant unique de l’objet auquel le document encodé devra être attaché automatiquement ; objet, le type d’objet auquel (...) -
Personnaliser en ajoutant son logo, sa bannière ou son image de fond
5 septembre 2013, parCertains 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, parPré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 ) (...)
Sur d’autres sites (7103)
-
"wrong sample count" When reading MP4 files using OpenCV
26 octobre 2022, par Object UnknownI want to marge some mp4 videos using OpenCV library, but when I try to read those videos using
cv::VideoCapture
, it outputs like that :

[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9AAE9D80] co located POCs unavailable
[h264 @ 000001EB9AAE7D80] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9A128600] co located POCs unavailable
[h264 @ 000001EB9A129840] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB9AA28E40] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9A169B00] co located POCs unavailable
[h264 @ 000001EB9A16B680] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB960CD680] co located POCs unavailable
[h264 @ 000001EB960CC8C0] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9A81DDC0] co located POCs unavailable
[h264 @ 000001EB9A81B000] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB960CB200] co located POCs unavailable
[h264 @ 000001EB960CBFC0] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB99F206C0] co located POCs unavailable
[h264 @ 000001EB99F20B40] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9A81D480] co located POCs unavailable
[h264 @ 000001EB9A81B000] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9AD02C00] co located POCs unavailable
[h264 @ 000001EB9AD02300] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9A81B480] co located POCs unavailable
[h264 @ 000001EB9A81B940] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[h264 @ 000001EB9AD02780] co located POCs unavailable
[h264 @ 000001EB9AD01E40] co located POCs unavailable
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count



and just exited with exit value 0. I want to know why it is reporting this and how to solve it please.


Heres my demo code :


#include <string>
#include <iostream>
#include <opencv2></opencv2>core/core.hpp>
#include <opencv2></opencv2>video/video.hpp>
#include <opencv2></opencv2>imgproc/imgproc.hpp>
#include <opencv2></opencv2>videoio/videoio.hpp>
#include <opencv2></opencv2>highgui/highgui.hpp>

int main()
{
 cv::Mat frame;
 cv::VideoCapture vcap;
 for (int i = 1; i <= 60; i++)
 {
 if (!vcap.open("G:\\Users\\15819\\Desktop\\Demo\\demo (" + std::to_string(i) + ").mp4"))
 {
 std::cout << "Failed to Open File: demo (" << i << ").mp4" << std::endl;
 continue;
 }
 while (!vcap.read(frame))
 cv::imshow("video", frame);
 }
 return 0;
}
</iostream></string>


I installed the
OpenCV
andFFmpeg
library usingvcpkg
, here's the library information (displayed byvcpkg list
command) :

ffmpeg:x64-windows 4.4.1#21 a library to decode, encode, transcode, mux, dem...
ffmpeg:x86-windows 4.4.1#21 a library to decode, encode, transcode, mux, dem...
ffmpeg[avcodec]:x64-windows Build the avcodec library
ffmpeg[avcodec]:x86-windows Build the avcodec library
ffmpeg[avdevice]:x64-windows Build the avdevice library
ffmpeg[avdevice]:x86-windows Build the avdevice library
ffmpeg[avfilter]:x64-windows Build the avfilter library
ffmpeg[avfilter]:x86-windows Build the avfilter library
ffmpeg[avformat]:x64-windows Build the avformat library
ffmpeg[avformat]:x86-windows Build the avformat library
ffmpeg[openh264]:x64-windows H.264 de/encoding via openh264
ffmpeg[openh264]:x86-windows H.264 de/encoding via openh264
ffmpeg[swresample]:x64-windows Build the swresample library
ffmpeg[swresample]:x86-windows Build the swresample library
ffmpeg[swscale]:x64-windows Build the swscale library
ffmpeg[swscale]:x86-windows Build the swscale library
opencv4:x64-windows 4.6.0#6 computer vision library
opencv4:x86-windows 4.6.0#6 computer vision library
opencv4[default-features]:x64-windows Platform-dependent default features
opencv4[default-features]:x86-windows Platform-dependent default features
opencv4[dnn]:x64-windows Enable dnn module
opencv4[dnn]:x86-windows Enable dnn module
opencv4[ffmpeg]:x64-windows ffmpeg support for opencv
opencv4[ffmpeg]:x86-windows ffmpeg support for opencv
opencv4[jpeg]:x64-windows JPEG support for opencv
opencv4[jpeg]:x86-windows JPEG support for opencv
opencv4[png]:x64-windows PNG support for opencv
opencv4[png]:x86-windows PNG support for opencv
opencv4[qt]:x64-windows Qt GUI support for opencv
opencv4[qt]:x86-windows Qt GUI support for opencv
opencv4[quirc]:x64-windows Enable QR code module
opencv4[quirc]:x86-windows Enable QR code module
opencv4[tiff]:x64-windows TIFF support for opencv
opencv4[tiff]:x86-windows TIFF support for opencv
opencv4[webp]:x64-windows WebP support for opencv
opencv4[webp]:x86-windows WebP support for opencv
opencv:x64-windows 4.6.0 Computer vision library
opencv:x86-windows 4.6.0 Computer vision library
opencv[default-features]:x64-windows Platform-dependent default features
opencv[default-features]:x86-windows Platform-dependent default features
opencv[dnn]:x64-windows Enable dnn module
opencv[dnn]:x86-windows Enable dnn module
opencv[jpeg]:x64-windows JPEG support for opencv
opencv[jpeg]:x86-windows JPEG support for opencv
opencv[png]:x64-windows PNG support for opencv
opencv[png]:x86-windows PNG support for opencv
opencv[quirc]:x64-windows Enable QR code module
opencv[quirc]:x86-windows Enable QR code module
opencv[tiff]:x64-windows TIFF support for opencv
opencv[tiff]:x86-windows TIFF support for opencv
opencv[webp]:x64-windows WebP support for opencv
opencv[webp]:x86-windows WebP support for opencv



Other Environments :


OS: Windows 11 x64 Professional Workstation
IDE: Visual Studio 2022
Project C++ Standard: C++14
Project Platform: x64 Release



-
ERROR "Tag [3][0][0][0] incompatible with output codec id '86016' (mp4a)" while writing headers for output mp4 file from a UDP stream
8 mai 2023, par lokit khemkaI have a running UDP stream, that I simulating using FFMPEG command :


ffmpeg -stream_loop -1 -re -i ./small_bunny_1080p_60fps.mp4 -v 0 -vcodec mpeg4 -f mpegts udp://127.0.0.1:23000



The video file is obtained from the github link : https://github.com/leandromoreira/ffmpeg-libav-tutorial


I keep getting error response, when I calling the function
avformat_write_header
. The output format ismp4
, output video codec isav1
and output audio codec is same as input audio codec.

I tried to create a "minimal reproducible code", however, I think it is still not completely minimal, but it reproduces the exact error.


#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libavutil></libavutil>timestamp.h>
#include <libavutil></libavutil>opt.h>
#include <libswscale></libswscale>swscale.h>
#include 
#include 
#include 

#include 
#include 

typedef struct StreamingContext{
 AVFormatContext* avfc;
 const AVCodec *video_avc;
 const AVCodec *audio_avc;
 AVStream *video_avs;
 AVStream *audio_avs;
 AVCodecContext *video_avcc;
 AVCodecContext *audio_avcc;
 int video_index;
 int audio_index;
 char* filename;
 struct SwsContext *sws_ctx;
}StreamingContext;


typedef struct StreamingParams{
 char copy_video;
 char copy_audio;
 char *output_extension;
 char *muxer_opt_key;
 char *muxer_opt_value;
 char *video_codec;
 char *audio_codec;
 char *codec_priv_key;
 char *codec_priv_value;
}StreamingParams;

void logging(const char *fmt, ...)
{
 va_list args;
 fprintf(stderr, "LOG: ");
 va_start(args, fmt);
 vfprintf(stderr, fmt, args);
 va_end(args);
 fprintf(stderr, "\n");
}

int fill_stream_info(AVStream *avs, const AVCodec **avc, AVCodecContext **avcc)
{
 *avc = avcodec_find_decoder(avs->codecpar->codec_id);
 *avcc = avcodec_alloc_context3(*avc);
 if (avcodec_parameters_to_context(*avcc, avs->codecpar) < 0)
 {
 logging("Failed to fill Codec Context.");
 return -1;
 }
 avcodec_open2(*avcc, *avc, NULL);
 return 0;
}

int open_media(const char *in_filename, AVFormatContext **avfc)
{
 *avfc = avformat_alloc_context();
 if (avformat_open_input(avfc, in_filename, NULL, NULL) != 0)
 {
 logging("Failed to open input file %s", in_filename);
 return -1;
 }

 if (avformat_find_stream_info(*avfc, NULL) < 0)
 {
 logging("Failed to get Stream Info.");
 return -1;
 }
}

int prepare_decoder(StreamingContext *sc)
{
 for (int i = 0; i < (int)sc->avfc->nb_streams; i++)
 {
 if (sc->avfc->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
 {
 sc->video_avs = sc->avfc->streams[i];
 sc->video_index = i;

 if (fill_stream_info(sc->video_avs, &sc->video_avc, &sc->video_avcc))
 {
 return -1;
 }
 }
 else if (sc->avfc->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
 {
 sc->audio_avs = sc->avfc->streams[i];
 sc->audio_index = i;

 if (fill_stream_info(sc->audio_avs, &sc->audio_avc, &sc->audio_avcc))
 {
 return -1;
 }
 }
 else
 {
 logging("Skipping Streams other than Audio and Video.");
 }
 }
 return 0;
}

int prepare_video_encoder(StreamingContext *encoder_sc, AVCodecContext *decoder_ctx, AVRational input_framerate,
 StreamingParams sp, int scaled_frame_width, int scaled_frame_height)
{
 encoder_sc->video_avs = avformat_new_stream(encoder_sc->avfc, NULL);
 encoder_sc->video_avc = avcodec_find_encoder_by_name(sp.video_codec);
 if (!encoder_sc->video_avc)
 {
 logging("Cannot find the Codec.");
 return -1;
 }

 encoder_sc->video_avcc = avcodec_alloc_context3(encoder_sc->video_avc);
 if (!encoder_sc->video_avcc)
 {
 logging("Could not allocate memory for Codec Context.");
 return -1;
 }

 av_opt_set(encoder_sc->video_avcc->priv_data, "preset", "fast", 0);
 if (sp.codec_priv_key && sp.codec_priv_value)
 av_opt_set(encoder_sc->video_avcc->priv_data, sp.codec_priv_key, sp.codec_priv_value, 0);

 encoder_sc->video_avcc->height = scaled_frame_height;
 encoder_sc->video_avcc->width = scaled_frame_width;
 encoder_sc->video_avcc->sample_aspect_ratio = decoder_ctx->sample_aspect_ratio;

 if (encoder_sc->video_avc->pix_fmts)
 encoder_sc->video_avcc->pix_fmt = encoder_sc->video_avc->pix_fmts[0];
 else
 encoder_sc->video_avcc->pix_fmt = decoder_ctx->pix_fmt;

 encoder_sc->video_avcc->bit_rate = 2 * 1000 * 1000;

 encoder_sc->video_avcc->time_base = av_inv_q(input_framerate);
 encoder_sc->video_avs->time_base = encoder_sc->video_avcc->time_base;

 

 if (avcodec_open2(encoder_sc->video_avcc, encoder_sc->video_avc, NULL) < 0)
 {
 logging("Could not open the Codec.");
 return -1;
 }
 avcodec_parameters_from_context(encoder_sc->video_avs->codecpar, encoder_sc->video_avcc);
 return 0;
}


int prepare_copy(AVFormatContext *avfc, AVStream **avs, AVCodecParameters *decoder_par)
{
 *avs = avformat_new_stream(avfc, NULL);
 avcodec_parameters_copy((*avs)->codecpar, decoder_par);
 return 0;
}

int encode_video(StreamingContext *decoder, StreamingContext *encoder, AVFrame *input_frame)
{
 if (input_frame)
 input_frame->pict_type = AV_PICTURE_TYPE_NONE;

 AVPacket *output_packet = av_packet_alloc();


 int response = avcodec_send_frame(encoder->video_avcc, input_frame);

 while (response >= 0)
 {
 response = avcodec_receive_packet(encoder->video_avcc, output_packet);
 if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)
 {
 break;
 }

 output_packet->stream_index = decoder->video_index;
 output_packet->duration = encoder->video_avs->time_base.den / encoder->video_avs->time_base.num / decoder->video_avs->avg_frame_rate.num * decoder->video_avs->avg_frame_rate.den;

 av_packet_rescale_ts(output_packet, decoder->video_avs->time_base, encoder->video_avs->time_base);
 response = av_interleaved_write_frame(encoder->avfc, output_packet);
 }

 av_packet_unref(output_packet);
 av_packet_free(&output_packet);

 return 0;
}

int remux(AVPacket **pkt, AVFormatContext **avfc, AVRational decoder_tb, AVRational encoder_tb)
{
 av_packet_rescale_ts(*pkt, decoder_tb, encoder_tb);
 if (av_interleaved_write_frame(*avfc, *pkt) < 0)
 {
 logging("Error while copying Stream Packet.");
 return -1;
 }
 return 0;
}

int transcode_video(StreamingContext *decoder, StreamingContext *encoder, AVPacket *input_packet, AVFrame *input_frame)
{
 int response = avcodec_send_packet(decoder->video_avcc, input_packet);
 while (response >= 0)
 {
 response = avcodec_receive_frame(decoder->video_avcc, input_frame);
 
 if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)
 {
 break;
 }
 if (response >= 0)
 {
 if (encode_video(decoder, encoder, input_frame))
 return -1;
 }

 av_frame_unref(input_frame);
 }
 return 0;
}

int main(int argc, char *argv[])
{
 const int scaled_frame_width = 854;
 const int scaled_frame_height = 480;
 StreamingParams sp = {0};
 sp.copy_audio = 1;
 sp.copy_video = 0;
 sp.video_codec = "libsvtav1";
 
 StreamingContext *decoder = (StreamingContext *)calloc(1, sizeof(StreamingContext));
 decoder->filename = "udp://127.0.0.1:23000";

 StreamingContext *encoder = (StreamingContext *)calloc(1, sizeof(StreamingContext));
 encoder->filename = "small_bunny_9.mp4";
 
 if (sp.output_extension)
 {
 strcat(encoder->filename, sp.output_extension);
 }

 open_media(decoder->filename, &decoder->avfc);
 prepare_decoder(decoder);


 avformat_alloc_output_context2(&encoder->avfc, NULL, "mp4", encoder->filename);
 AVRational input_framerate = av_guess_frame_rate(decoder->avfc, decoder->video_avs, NULL);
 prepare_video_encoder(encoder, decoder->video_avcc, input_framerate, sp, scaled_frame_width, scaled_frame_height);

 prepare_copy(encoder->avfc, &encoder->audio_avs, decoder->audio_avs->codecpar);
 

 if (encoder->avfc->oformat->flags & AVFMT_GLOBALHEADER)
 encoder->avfc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

 if (!(encoder->avfc->oformat->flags & AVFMT_NOFILE))
 {
 if (avio_open(&encoder->avfc->pb, encoder->filename, AVIO_FLAG_WRITE) < 0)
 {
 logging("could not open the output file");
 return -1;
 }
 }

 
 if (avformat_write_header(encoder->avfc, NULL) < 0)
 {
 logging("an error occurred when opening output file");
 return -1;
 }

 AVFrame *input_frame = av_frame_alloc();
 AVPacket *input_packet = av_packet_alloc();

 while (1)
 {
 int ret = av_read_frame(decoder->avfc, input_packet);
 if(ret<0)
 break;
 if (decoder->avfc->streams[input_packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
 {
 if (transcode_video(decoder, encoder, input_packet, input_frame))
 return -1;
 av_packet_unref(input_packet);

 }
 else if (decoder->avfc->streams[input_packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
 {
 
 if (remux(&input_packet, &encoder->avfc, decoder->audio_avs->time_base, encoder->audio_avs->time_base))
 return -1;
 }
 else
 {
 logging("Ignoring all nonvideo or audio packets.");
 }
 }

 if (encode_video(decoder, encoder, NULL))
 return -1;
 

 av_write_trailer(encoder->avfc);


 if (input_frame != NULL)
 {
 av_frame_free(&input_frame);
 input_frame = NULL;
 }

 if (input_packet != NULL)
 {
 av_packet_free(&input_packet);
 input_packet = NULL;
 }

 avformat_close_input(&decoder->avfc);

 avformat_free_context(decoder->avfc);
 decoder->avfc = NULL;
 avformat_free_context(encoder->avfc);
 encoder->avfc = NULL;

 avcodec_free_context(&decoder->video_avcc);
 decoder->video_avcc = NULL;
 avcodec_free_context(&decoder->audio_avcc);
 decoder->audio_avcc = NULL;

 free(decoder);
 decoder = NULL;
 free(encoder);
 encoder = NULL;

 return 0;
}



-
ERROR "Application provided invalid, non monotonically increasing dts to muxer in stream 1 : 6874 >= 6874" while writing encoded output to an mp4 file
11 mai 2023, par lokit khemkaI have a running RTSP stream, streaming video on a loop using the following FFMPEG command :


ffmpeg -re -stream_loop -1 -i ./ffmpeg_c_test/small_bunny_1080p_60fps.mp4 -ac 2 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/mystream



The video file is obtained from the github link : https://github.com/leandromoreira/ffmpeg-libav-tutorial


I keep getting error response, when I calling the function
av_interleaved_write_frame
called from the functionremux
in the attached program. The output format ismp4
, output video codec isav1
and output audio codec is same as input audio codec. The error is from audio stream.

I tried to create a "minimal reproducible code", however, I think it is still not completely minimal, but it reproduces the exact error.


#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libavutil></libavutil>timestamp.h>
#include <libavutil></libavutil>opt.h>
#include <libswscale></libswscale>swscale.h>
#include 
#include 
#include 

#include 
#include 

typedef struct StreamingContext{
 AVFormatContext* avfc;
 const AVCodec *video_avc;
 const AVCodec *audio_avc;
 AVStream *video_avs;
 AVStream *audio_avs;
 AVCodecContext *video_avcc;
 AVCodecContext *audio_avcc;
 int video_index;
 int audio_index;
 char* filename;
 struct SwsContext *sws_ctx;
}StreamingContext;


typedef struct StreamingParams{
 char copy_video;
 char copy_audio;
 char *output_extension;
 char *muxer_opt_key;
 char *muxer_opt_value;
 char *video_codec;
 char *audio_codec;
 char *codec_priv_key;
 char *codec_priv_value;
}StreamingParams;

void logging(const char *fmt, ...)
{
 va_list args;
 fprintf(stderr, "LOG: ");
 va_start(args, fmt);
 vfprintf(stderr, fmt, args);
 va_end(args);
 fprintf(stderr, "\n");
}

int fill_stream_info(AVStream *avs, const AVCodec **avc, AVCodecContext **avcc)
{
 *avc = avcodec_find_decoder(avs->codecpar->codec_id);
 *avcc = avcodec_alloc_context3(*avc);
 if (avcodec_parameters_to_context(*avcc, avs->codecpar) < 0)
 {
 logging("Failed to fill Codec Context.");
 return -1;
 }
 avcodec_open2(*avcc, *avc, NULL);
 return 0;
}

int open_media(const char *in_filename, AVFormatContext **avfc)
{
 *avfc = avformat_alloc_context();
 if (avformat_open_input(avfc, in_filename, NULL, NULL) != 0)
 {
 logging("Failed to open input file %s", in_filename);
 return -1;
 }

 if (avformat_find_stream_info(*avfc, NULL) < 0)
 {
 logging("Failed to get Stream Info.");
 return -1;
 }
}

int prepare_decoder(StreamingContext *sc)
{
 for (int i = 0; i < (int)sc->avfc->nb_streams; i++)
 {
 if (sc->avfc->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
 {
 sc->video_avs = sc->avfc->streams[i];
 sc->video_index = i;

 if (fill_stream_info(sc->video_avs, &sc->video_avc, &sc->video_avcc))
 {
 return -1;
 }
 }
 else if (sc->avfc->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
 {
 sc->audio_avs = sc->avfc->streams[i];
 sc->audio_index = i;

 if (fill_stream_info(sc->audio_avs, &sc->audio_avc, &sc->audio_avcc))
 {
 return -1;
 }
 }
 else
 {
 logging("Skipping Streams other than Audio and Video.");
 }
 }
 return 0;
}

int prepare_video_encoder(StreamingContext *encoder_sc, AVCodecContext *decoder_ctx, AVRational input_framerate,
 StreamingParams sp, int scaled_frame_width, int scaled_frame_height)
{
 encoder_sc->video_avs = avformat_new_stream(encoder_sc->avfc, NULL);
 encoder_sc->video_avc = avcodec_find_encoder_by_name(sp.video_codec);
 if (!encoder_sc->video_avc)
 {
 logging("Cannot find the Codec.");
 return -1;
 }

 encoder_sc->video_avcc = avcodec_alloc_context3(encoder_sc->video_avc);
 if (!encoder_sc->video_avcc)
 {
 logging("Could not allocate memory for Codec Context.");
 return -1;
 }

 av_opt_set(encoder_sc->video_avcc->priv_data, "preset", "fast", 0);
 if (sp.codec_priv_key && sp.codec_priv_value)
 av_opt_set(encoder_sc->video_avcc->priv_data, sp.codec_priv_key, sp.codec_priv_value, 0);

 encoder_sc->video_avcc->height = scaled_frame_height;
 encoder_sc->video_avcc->width = scaled_frame_width;
 encoder_sc->video_avcc->sample_aspect_ratio = decoder_ctx->sample_aspect_ratio;

 if (encoder_sc->video_avc->pix_fmts)
 encoder_sc->video_avcc->pix_fmt = encoder_sc->video_avc->pix_fmts[0];
 else
 encoder_sc->video_avcc->pix_fmt = decoder_ctx->pix_fmt;

 encoder_sc->video_avcc->bit_rate = 2 * 1000 * 1000;

 encoder_sc->video_avcc->time_base = av_inv_q(input_framerate);
 encoder_sc->video_avs->time_base = encoder_sc->video_avcc->time_base;

 

 if (avcodec_open2(encoder_sc->video_avcc, encoder_sc->video_avc, NULL) < 0)
 {
 logging("Could not open the Codec.");
 return -1;
 }
 avcodec_parameters_from_context(encoder_sc->video_avs->codecpar, encoder_sc->video_avcc);
 return 0;
}


int prepare_copy(AVFormatContext *avfc, AVStream **avs, AVCodecParameters *decoder_par)
{
 *avs = avformat_new_stream(avfc, NULL);
 avcodec_parameters_copy((*avs)->codecpar, decoder_par);
 return 0;
}

int encode_video(StreamingContext *decoder, StreamingContext *encoder, AVFrame *input_frame)
{
 if (input_frame)
 input_frame->pict_type = AV_PICTURE_TYPE_NONE;

 AVPacket *output_packet = av_packet_alloc();


 int response = avcodec_send_frame(encoder->video_avcc, input_frame);

 while (response >= 0)
 {
 response = avcodec_receive_packet(encoder->video_avcc, output_packet);
 if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)
 {
 break;
 }

 output_packet->stream_index = decoder->video_index;
 output_packet->duration = encoder->video_avs->time_base.den / encoder->video_avs->time_base.num;

 av_packet_rescale_ts(output_packet, decoder->video_avs->time_base, encoder->video_avs->time_base);
 response = av_interleaved_write_frame(encoder->avfc, output_packet);
 }

 av_packet_unref(output_packet);
 av_packet_free(&output_packet);

 return 0;
}

int remux(AVPacket **pkt, AVFormatContext **avfc, AVRational decoder_tb, AVRational encoder_tb)
{
 (*pkt)->duration = av_rescale_q((*pkt)->duration, decoder_tb, encoder_tb);
 (*pkt)->pos = -1;
 av_packet_rescale_ts(*pkt, decoder_tb, encoder_tb);
 if (av_interleaved_write_frame(*avfc, *pkt) < 0)
 {
 logging("Error while copying Stream Packet.");
 return -1;
 }
 return 0;
}

int transcode_video(StreamingContext *decoder, StreamingContext *encoder, AVPacket *input_packet, AVFrame *input_frame)
{
 int response = avcodec_send_packet(decoder->video_avcc, input_packet);
 while (response >= 0)
 {
 response = avcodec_receive_frame(decoder->video_avcc, input_frame);
 
 if (response == AVERROR(EAGAIN) || response == AVERROR_EOF)
 {
 break;
 }
 if (response >= 0)
 {
 if (encode_video(decoder, encoder, input_frame))
 return -1;
 }

 av_frame_unref(input_frame);
 }
 return 0;
}

int main(int argc, char *argv[])
{
 const int scaled_frame_width = 854;
 const int scaled_frame_height = 480;
 StreamingParams sp = {0};
 sp.copy_audio = 1;
 sp.copy_video = 0;
 sp.video_codec = "libsvtav1";
 
 StreamingContext *decoder = (StreamingContext *)calloc(1, sizeof(StreamingContext));
 decoder->filename = "rtsp://localhost:8554/mystream";

 StreamingContext *encoder = (StreamingContext *)calloc(1, sizeof(StreamingContext));
 encoder->filename = "small_bunny_9.mp4";
 
 if (sp.output_extension)
 {
 strcat(encoder->filename, sp.output_extension);
 }

 open_media(decoder->filename, &decoder->avfc);
 prepare_decoder(decoder);


 avformat_alloc_output_context2(&encoder->avfc, NULL, "mp4", encoder->filename);
 AVRational input_framerate = av_guess_frame_rate(decoder->avfc, decoder->video_avs, NULL);
 prepare_video_encoder(encoder, decoder->video_avcc, input_framerate, sp, scaled_frame_width, scaled_frame_height);

 prepare_copy(encoder->avfc, &encoder->audio_avs, decoder->audio_avs->codecpar);
 

 if (encoder->avfc->oformat->flags & AVFMT_GLOBALHEADER)
 encoder->avfc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

 if (!(encoder->avfc->oformat->flags & AVFMT_NOFILE))
 {
 if (avio_open(&encoder->avfc->pb, encoder->filename, AVIO_FLAG_WRITE) < 0)
 {
 logging("could not open the output file");
 return -1;
 }
 }

 
 if (avformat_write_header(encoder->avfc, NULL) < 0)
 {
 logging("an error occurred when opening output file");
 return -1;
 }

 AVFrame *input_frame = av_frame_alloc();
 AVPacket *input_packet = av_packet_alloc();

 while (1)
 {
 int ret = av_read_frame(decoder->avfc, input_packet);
 if(ret<0)
 break;
 if (decoder->avfc->streams[input_packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
 {
 if (transcode_video(decoder, encoder, input_packet, input_frame))
 return -1;
 av_packet_unref(input_packet);

 }
 else if (decoder->avfc->streams[input_packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
 {
 
 if (remux(&input_packet, &encoder->avfc, decoder->audio_avs->time_base, encoder->audio_avs->time_base))
 return -1;
 }
 else
 {
 logging("Ignoring all nonvideo or audio packets.");
 }
 }

 if (encode_video(decoder, encoder, NULL))
 return -1;
 

 av_write_trailer(encoder->avfc);


 if (input_frame != NULL)
 {
 av_frame_free(&input_frame);
 input_frame = NULL;
 }

 if (input_packet != NULL)
 {
 av_packet_free(&input_packet);
 input_packet = NULL;
 }

 avformat_close_input(&decoder->avfc);

 avformat_free_context(decoder->avfc);
 decoder->avfc = NULL;
 avformat_free_context(encoder->avfc);
 encoder->avfc = NULL;

 avcodec_free_context(&decoder->video_avcc);
 decoder->video_avcc = NULL;
 avcodec_free_context(&decoder->audio_avcc);
 decoder->audio_avcc = NULL;

 free(decoder);
 decoder = NULL;
 free(encoder);
 encoder = NULL;

 return 0;
}