Recherche avancée

Médias (1)

Mot : - Tags -/framasoft

Autres articles (55)

  • Problèmes fréquents

    10 mars 2010, par

    PHP et safe_mode activé
    Une des principales sources de problèmes relève de la configuration de PHP et notamment de l’activation du safe_mode
    La solution consiterait à soit désactiver le safe_mode soit placer le script dans un répertoire accessible par apache pour le site

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • De l’upload à la vidéo finale [version standalone]

    31 janvier 2010, par

    Le chemin d’un document audio ou vidéo dans SPIPMotion est divisé en trois étapes distinctes.
    Upload et récupération d’informations de la vidéo source
    Dans un premier temps, il est nécessaire de créer un article SPIP et de lui joindre le document vidéo "source".
    Au moment où ce document est joint à l’article, deux actions supplémentaires au comportement normal sont exécutées : La récupération des informations techniques des flux audio et video du fichier ; La génération d’une vignette : extraction d’une (...)

Sur d’autres sites (7059)

  • ffmpeg converting JPG slideshow to MKV

    17 décembre 2018, par phol

    I am trying to convert a set of jpg files to a slideshow with varying durations using ffconcat

    output.txt contents :

    ffconcat version 1.0
    file slide_0001.jpg
    duration 0.163
    file slide_0002.jpg
    duration 0.533
    file slide_0003.jpg
    duration 1.067
    file slide_0004.jpg
    duration 0.533
    file slide_0005.jpg
    etc.

    FFmpeg command :

    ffmpeg -i output.txt output.mkv

    I also tried :

    ffmpeg -i output.txt -c:v copy output.mkv

    However, when converting, the colours of the images become skewed.
    White becomes pink / purple and dark green becomes light green.
    The same happens when choosing different codecs and containers.
    Is there a way to solve this ?

    EDIT :
    I performed the same conversion again. I attached the log output as requested.
    However, in the meantime I have figured out that converting without ffconcat duration and then altering timecodes with mp4fpsmod is more efficient in terms of storage (3 vs 40 MB) and gives less issues in different players. The result is nonetheless the same : colours are still wrong, both on my workstation (Ubuntu 18.04) and laptop (macOS Mojave).

    I tried to alter things with pix_fmt and -vf format as can be seen in the second log output. This did not solve the problem.

    Background info :
    The input jpg files are from a lecture recording made with MediaSite, which has both a video stream for the room as well as this slideshow stream for the slides.

    Example of input :
    Input image
    Example of output :
    Screenshot of output
    log output MKV conversion :

       $ ffmpeg -i outputnew.txt output12345.mkv
    ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
    built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
    configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox
    libavutil      56. 22.100 / 56. 22.100
    libavcodec     58. 35.100 / 58. 35.100
    libavformat    58. 20.100 / 58. 20.100
    libavdevice    58.  5.100 / 58.  5.100
    libavfilter     7. 40.101 /  7. 40.101
    libavresample   4.  0.  0 /  4.  0.  0
    libswscale      5.  3.100 /  5.  3.100
    libswresample   3.  3.100 /  3.  3.100
    libpostproc    55.  3.100 / 55.  3.100
    Input #0, concat, from 'outputnew.txt':
    Duration: N/A, start: 0.000000, bitrate: N/A
       Stream #0:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1280x720, 25 tbr, 25 tbn, 25 tbc
    Stream mapping:
    Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
    Press [q] to stop, [?] for help
    [libx264 @ 0x7fb284802800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
    [libx264 @ 0x7fb284802800] profile High 4:4:4 Predictive, level 3.1, 4:4:4 8-bit
    [libx264 @ 0x7fb284802800] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, matroska, to 'output12345.mkv':
    Metadata:
       encoder         : Lavf58.20.100
       Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuvj444p(pc), 1280x720, q=-1--1, 25 fps, 1k tbn, 25 tbc
       Metadata:
       encoder         : Lavc58.35.100 libx264
       Side data:
       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    [mjpeg @ 0x7fb284061200] EOI missing, emulating=00:02:12.96 bitrate= 491.3kbits/s speed=14.3x        
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 487.2kbits/s speed=14.3x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 333.0kbits/s speed=22.3x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 338.8kbits/s speed=22.7x    
       Last message repeated 2 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 164.7kbits/s speed=41.6x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 122.7kbits/s speed=55.7x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 111.2kbits/s speed=60.5x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte= 105.3kbits/s speed=64.4x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  82.2kbits/s speed=82.7x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  79.7kbits/s speed=85.8x    
       Last message repeated 2 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  59.7kbits/s speed= 114x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  53.8kbits/s speed= 127x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  54.7kbits/s speed= 124x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  47.1kbits/s speed= 143x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  47.0kbits/s speed= 144x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  44.6kbits/s speed= 151x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  34.4kbits/s speed= 194x    
       Last message repeated 2 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  32.9kbits/s speed= 204x    
       Last message repeated 2 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  32.8kbits/s speed= 203x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  32.6kbits/s speed= 202x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  28.8kbits/s speed= 229x    
       Last message repeated 2 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  27.9kbits/s speed= 236x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  27.9kbits/s speed= 233x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  23.9kbits/s speed= 274x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  24.2kbits/s speed= 273x    
       Last message repeated 2 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  24.2kbits/s speed= 274x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  24.0kbits/s speed= 276x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  24.2kbits/s speed= 273x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  23.6kbits/s speed= 278x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  23.7kbits/s speed= 279x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  23.6kbits/s speed= 279x    
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  24.0kbits/s speed= 276x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  23.5kbits/s speed= 281x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  20.4kbits/s speed= 325x    
    [mjpeg @ 0x7fb28502a000] EOI missing, emulating
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  20.1kbits/s speed= 329x    
       Last message repeated 1 times
    [matroska @ 0x7fb284812e00] Starting new cluster due to timestampte=  20.1kbits/s speed= 330x    
    frame=  635 fps= 14 q=-1.0 Lsize=   37389kB time=04:22:06.76 bitrate=  19.5kbits/s speed= 343x    
    video:37378kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.029620%
    [libx264 @ 0x7fb284802800] frame I:16    Avg QP:11.98  size:154224
    [libx264 @ 0x7fb284802800] frame P:184   Avg QP:13.30  size: 79029
    [libx264 @ 0x7fb284802800] frame B:435   Avg QP:13.19  size: 48887
    [libx264 @ 0x7fb284802800] consecutive B-frames:  6.0%  4.4% 10.9% 78.7%
    [libx264 @ 0x7fb284802800] mb I  I16..4: 55.7%  0.0% 44.3%
    [libx264 @ 0x7fb284802800] mb P  I16..4: 32.4%  0.0% 21.5%  P16..4: 13.3% 15.1% 11.3%  0.0%  0.0%    skip: 6.4%
    [libx264 @ 0x7fb284802800] mb B  I16..4: 17.8%  0.0%  7.2%  B16..8: 19.1% 19.4%  6.5%  direct:14.6%  skip:15.3%  L0:47.0% L1:38.9% BI:14.1%
    [libx264 @ 0x7fb284802800] coded y,u,v intra: 63.7% 26.1% 56.3% inter: 46.5% 24.6% 43.5%
    [libx264 @ 0x7fb284802800] i16 v,h,dc,p: 19% 18% 58%  4%
    [libx264 @ 0x7fb284802800] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 20% 25%  4%  4%  3%  3%  3%  3%
    [libx264 @ 0x7fb284802800] Weighted P-Frames: Y:5.4% UV:5.4%
    [libx264 @ 0x7fb284802800] ref P L0: 43.2%  4.4% 30.8% 21.4%  0.2%
    [libx264 @ 0x7fb284802800] ref B L0: 64.1% 27.3%  8.6%
    [libx264 @ 0x7fb284802800] ref B L1: 85.3% 14.7%
    [libx264 @ 0x7fb284802800] kb/s:19.25

    Log output mp4 conversion :

    $ ffmpeg -i slide_%04d.jpg -vf format=rgba -pix_fmt yuv420p -vcodec libx264 -movflags +faststart -preset veryslow output12345.mp4
    ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
    built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
    configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox
    libavutil      56. 22.100 / 56. 22.100
    libavcodec     58. 35.100 / 58. 35.100
    libavformat    58. 20.100 / 58. 20.100
    libavdevice    58.  5.100 / 58.  5.100
    libavfilter     7. 40.101 /  7. 40.101
    libavresample   4.  0.  0 /  4.  0.  0
    libswscale      5.  3.100 /  5.  3.100
    libswresample   3.  3.100 /  3.  3.100
    libpostproc    55.  3.100 / 55.  3.100
    Input #0, image2, from 'slide_%04d.jpg':
    Duration: 00:00:25.36, start: 0.000000, bitrate: N/A
       Stream #0:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1280x720, 25 fps, 25 tbr, 25 tbn, 25 tbc
    File 'output12345.mp4' already exists. Overwrite ? [y/N] y
    Stream mapping:
    Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
    Press [q] to stop, [?] for help
    [swscaler @ 0x7fb7e280b000] deprecated pixel format used, make sure you did set range correctly
    [libx264 @ 0x7fb7e1803c00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
    [libx264 @ 0x7fb7e1803c00] profile High, level 5.0
    [libx264 @ 0x7fb7e1803c00] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0 analyse=0x3:0x133 me=umh subme=10 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=24 chroma_me=1 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=8 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to 'output12345.mp4':
    Metadata:
       encoder         : Lavf58.20.100
       Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 1280x720, q=-1--1, 25 fps, 12800 tbn, 25 tbc
       Metadata:
       encoder         : Lavc58.35.100 libx264
       Side data:
       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    [mp4 @ 0x7fb7e1801800] Starting second pass: moving the moov atom to the beginning of the file    
    frame=  634 fps=8.5 q=-1.0 Lsize=    2252kB time=00:00:25.24 bitrate= 731.0kbits/s speed=0.337x    
    video:2245kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.307448%
    [libx264 @ 0x7fb7e1803c00] frame I:5     Avg QP:19.12  size: 49393
    [libx264 @ 0x7fb7e1803c00] frame P:131   Avg QP:22.18  size:  9379
    [libx264 @ 0x7fb7e1803c00] frame B:498   Avg QP:23.78  size:  1652
    [libx264 @ 0x7fb7e1803c00] consecutive B-frames:  3.2%  1.6%  3.3% 29.7%  7.9% 16.1%  7.7% 16.4% 14.2%
    [libx264 @ 0x7fb7e1803c00] mb I  I16..4: 45.7% 37.9% 16.4%
    [libx264 @ 0x7fb7e1803c00] mb P  I16..4:  6.0%  5.3%  1.3%  P16..4: 19.9%  1.9%  3.7%  0.3%  0.1%    skip:61.5%
    [libx264 @ 0x7fb7e1803c00] mb B  I16..4:  0.3%  0.4%  0.1%  B16..8: 17.5%  1.0%  0.2%  direct: 0.3%  skip:80.2%  L0:52.3% L1:46.9% BI: 0.8%
    [libx264 @ 0x7fb7e1803c00] 8x8 transform intra:43.0% inter:48.9%
    [libx264 @ 0x7fb7e1803c00] direct mvs  spatial:99.2% temporal:0.8%
    [libx264 @ 0x7fb7e1803c00] coded y,uvDC,uvAC intra: 16.9% 25.8% 16.6% inter: 1.1% 1.9% 1.2%
    [libx264 @ 0x7fb7e1803c00] i16 v,h,dc,p: 61% 28%  6%  6%
    [libx264 @ 0x7fb7e1803c00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20%  9% 50%  3%  4%  3%  3%  3%  5%
    [libx264 @ 0x7fb7e1803c00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 18% 23% 19%  5%  7%  6%  6%  5% 10%
    [libx264 @ 0x7fb7e1803c00] i8c dc,h,v,p: 46% 40% 13%  1%
    [libx264 @ 0x7fb7e1803c00] Weighted P-Frames: Y:5.3% UV:5.3%
    [libx264 @ 0x7fb7e1803c00] ref P L0: 33.2%  3.1% 11.6%  7.3%  8.8%  6.4%  6.5%  3.1%  3.2%  2.6%  2.4%  2.5%  2.8%  2.8%  2.3%  1.4%
    [libx264 @ 0x7fb7e1803c00] ref B L0: 42.0% 15.1% 12.0%  5.4%  4.9%  4.3%  4.0%  1.9%  2.0%  1.8%  1.7%  1.8%  1.7%  1.1%  0.5%
    [libx264 @ 0x7fb7e1803c00] ref B L1: 83.5% 16.5%
    [libx264 @ 0x7fb7e1803c00] kb/s:725.10

    Player :
    QuickTime, VLC and Kodi on both Linux and Mac.

    EDIT 2 :
    Input files : https://drive.google.com/open?id=1kbBkSDSwe6ywgQ8lkjqkh-MKCzGA4bj8

  • encode WAV audio to AAC using libavcodec

    3 juillet 2018, par siml

    i want to encode my wav audio file ( wav header + pcm data ) to aac audio file.
    i found many example on the internet but they are not good for me.
    Notice : i WON’T send my file path to the libavcodec methods directly, i want to load in my buffer first and then pass buffer to encoder.
    I worked by AVIOContext to. but i couldn’t make it work finally.
    Actually i want a complete example of encoding wav to aac that it is reading from buffer and writing result to another buffer ( NO DIRECT FILE PATH ).
    thank you .

    this is my code that is working but it make sound noisy. please help me.

    this is my test wav sound link :
    raw_audio.wav
    this is my converted wav used by ffmpeg.exe
    enter link description here

    #include
    #include <libavcodec></libavcodec>avcodec.h>
    #include <libavformat></libavformat>avformat.h>
    #include "libswresample/swresample.h"
    #include "libavresample/avresample.h"

    #define SHOW(x) printf("%s\n",x)

    FILE* out_file;
    struct buffer_data {
      uint8_t *ptr;
      size_t size; ///&lt; size left in the buffer
    };
    struct buffer_data_w {
      uint8_t *buf;
      size_t size;
      uint8_t *ptr;
      size_t room; ///&lt; size left in the buffer
    };
    static int read_packet(void *opaque, uint8_t *buf, int buf_size) {
      struct buffer_data *bd = (struct buffer_data *) opaque;

      buf_size = FFMIN(buf_size, bd->size);

      if (!buf_size)
        return AVERROR_EOF;

      /* copy internal buffer data to buf */
      memcpy(buf, bd->ptr, buf_size);
      bd->ptr += buf_size;
      bd->size -= buf_size;

      return buf_size;
    }

    static int write_packet(void *opaque, uint8_t *buf, int buf_size) {

       printf("write_packet : %d\n", buf_size);

       fwrite(buf, 1, buf_size, out_file);
       return buf_size;
    }
    static char *get_error_text(const int error) {
       static char error_buffer[255];
       av_strerror(error, error_buffer, sizeof(error_buffer));
       return error_buffer;
    }
    static void init_packet(AVPacket *packet) {
       av_init_packet(packet);
       /* Set the packet data and size so that it is recognized as being empty. */
       packet->data = NULL;
       packet->size = 0;
    }

    static int init_converted_samples(uint8_t ***converted_input_samples,
           AVCodecContext *output_codec_context, int frame_size) {
       int error;

       /* Allocate as many pointers as there are audio channels.
        * Each pointer will later point to the audio samples of the corresponding
        * channels (although it may be NULL for interleaved formats).
        */
       if (!(*converted_input_samples = calloc(output_codec_context->channels,
               sizeof(float)))) {
           fprintf(stderr, "Could not allocate converted input sample pointers\n");
           return AVERROR(ENOMEM);
       }

       /* Allocate memory for the samples of all channels in one consecutive
        * block for convenience. */
       if ((error = av_samples_alloc(*converted_input_samples, NULL,
               output_codec_context->channels, frame_size,
               output_codec_context->sample_fmt, 0)) &lt; 0) {
           fprintf(stderr,
                   "Could not allocate converted input samples (error '%s')\n",
                   get_error_text(error));
           av_freep(&amp;(*converted_input_samples)[0]);
           free(*converted_input_samples);
           return error;
       }
       return 0;
    }
    static int convert_samples(uint8_t **input_data, uint8_t **converted_data,
           const int frame_size, AVAudioResampleContext *resample_context) {
       int error;

       /* Convert the samples using the resampler. */
       if ((error = avresample_convert(resample_context, converted_data, 0,
               frame_size, input_data, 0, frame_size)) &lt; 0) {
           fprintf(stderr, "Could not convert input samples (error '%s')\n",
                   get_error_text(error));
           return error;
       }

       /* Perform a sanity check so that the number of converted samples is
        * not greater than the number of samples to be converted.
        * If the sample rates differ, this case has to be handled differently. */
       if (avresample_available(resample_context)) {
           fprintf(stderr, "Converted samples left over\n");
           return AVERROR_EXIT;
       }

       return 0;
    }
    static uint64_t pts = 0;
    static int encode_audio_frame(AVFrame *frame,
           AVFormatContext *output_format_context,
           AVCodecContext *output_codec_context, int *data_present) {
       /* Packet used for temporary storage. */
       AVPacket output_packet;
       int error;
       init_packet(&amp;output_packet);

       /* Set a timestamp based on the sample rate for the container. */
       if (frame) {
           frame->pts = pts;
           pts += frame->nb_samples;
       }

       /* Send the audio frame stored in the temporary packet to the encoder.
        * The output audio stream encoder is used to do this. */
       error = avcodec_send_frame(output_codec_context, frame);
       /* The encoder signals that it has nothing more to encode. */
       if (error == AVERROR_EOF) {
           error = 0;
           goto cleanup;
       } else if (error &lt; 0) {
           fprintf(stderr, "Could not send packet for encoding (error '%s')\n",
                   get_error_text(error));
           return error;
       }

       /* Receive one encoded frame from the encoder. */
       error = avcodec_receive_packet(output_codec_context, &amp;output_packet);
       /* If the encoder asks for more data to be able to provide an
        * encoded frame, return indicating that no data is present. */
       if (error == AVERROR(EAGAIN)) {
           error = 0;
           goto cleanup;
           /* If the last frame has been encoded, stop encoding. */
       } else if (error == AVERROR_EOF) {
           error = 0;
           goto cleanup;
       } else if (error &lt; 0) {
           fprintf(stderr, "Could not encode frame (error '%s')\n",
                   get_error_text(error));
           goto cleanup;
           /* Default case: Return encoded data. */
       } else {
           *data_present = 1;
       }

       /* Write one audio frame from the temporary packet to the output file. */
       if (*data_present
               &amp;&amp; (error = av_write_frame(output_format_context, &amp;output_packet))
                       &lt; 0) {
           fprintf(stderr, "Could not write frame (error '%s')\n",
                   get_error_text(error));
           goto cleanup;
       }

       cleanup: av_packet_unref(&amp;output_packet);
       return error;
    }
    static int init_output_frame(AVFrame **frame,
           AVCodecContext *output_codec_context, int frame_size) {
       int error;

       /* Create a new frame to store the audio samples. */
       if (!(*frame = av_frame_alloc())) {
           fprintf(stderr, "Could not allocate output frame\n");
           return AVERROR_EXIT;
       }

       /* Set the frame's parameters, especially its size and format.
        * av_frame_get_buffer needs this to allocate memory for the
        * audio samples of the frame.
        * Default channel layouts based on the number of channels
        * are assumed for simplicity. */
       (*frame)->nb_samples = frame_size;
       (*frame)->channel_layout = AV_CH_LAYOUT_STEREO; //output_codec_context->channel_layout;
       (*frame)->format = AV_SAMPLE_FMT_FLTP; //output_codec_context->sample_fmt;
       (*frame)->sample_rate = 44100; //output_codec_context->sample_rate;
       (*frame)->channels = 2;
       /* Allocate the samples of the created frame. This call will make
        * sure that the audio frame can hold as many samples as specified. */
       if ((error = av_frame_get_buffer(*frame, 0)) &lt; 0) {
           fprintf(stderr,
                   "Could not allocate output frame samples (error '%s')\n",
                   get_error_text(error));
           av_frame_free(*frame);
           return error;
       }

       return 0;
    }
    int main() {

       av_register_all();

       int ret = 0;

       AVFormatContext *input_format_context = avformat_alloc_context();
       if (!(input_format_context)) {
           SHOW("!input_format_context");
           exit(1);
       }

       AVIOContext *avio_context = NULL;
       uint8_t *buffer = NULL;
       uint8_t *avio_context_buffer = NULL;
       size_t buffer_size;
       size_t avio_context_buffer_size = 1024;
       struct buffer_data bd = { 0 };

       out_file = fopen("raw_audio.aac", "wb");
       FILE* temp_file = fopen("temp_file.dat", "wb");

       FILE* input_file = fopen("raw_audio.wav", "rb");
       fseek(input_file, 0, SEEK_END);
       buffer_size = ftell(input_file);
       fseek(input_file, 0, SEEK_SET);

       buffer = malloc(buffer_size * (sizeof(uint8_t)));
       fread(buffer, buffer_size, sizeof(uint8_t), input_file);

       /* fill opaque structure used by the AVIOContext read callback */
       bd.ptr = buffer;
       bd.size = buffer_size;

       avio_context_buffer = av_malloc(avio_context_buffer_size);
       if (!avio_context_buffer) {
           SHOW("!avio_context_buffer");
           exit(1);
       }
       avio_context = avio_alloc_context(avio_context_buffer,
               avio_context_buffer_size, 0, &amp;bd, &amp;read_packet, NULL, NULL);
       if (!avio_context) {
           SHOW("!avio_context");
           exit(1);
       }

       input_format_context->pb = avio_context;

       ret = avformat_open_input(&amp;input_format_context, NULL, NULL, NULL);
       if (ret &lt; 0) {
           SHOW("!avformat_open_input");
           exit(1);
       }

       ret = avformat_find_stream_info(input_format_context, NULL);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not find stream information\n");
           return -1;
       }

       AVStream * input_audio_stream = input_format_context->streams[0];
    //  input_audio_stream = avformat_new_stream(input_format_context, 0);
    //  if (!input_audio_stream) {
    //      fprintf(stderr, "Could not alloc audio stream!");
    //      exit(1);
    //  }

       AVCodec* input_codec = avcodec_find_decoder(
               input_format_context->streams[0]->codec->codec_id);

       if (!input_codec) {
           SHOW("!input_codec");
           exit(1);
       }

       ret = avcodec_open2(input_format_context->streams[0]->codec, input_codec,
       NULL);
       if (ret &lt; 0) {
           SHOW("!avcodec_open2(input_format_context)");
           exit(1);
       }

       ///start encoder
       ///
       AVOutputFormat *out_format = av_guess_format(NULL, "test.aac", NULL);
       if (!out_format) {
           SHOW("!out_format");
           exit(1);
       }

       AVFormatContext *out_format_context;
       ret = avformat_alloc_output_context2(&amp;out_format_context, out_format, NULL,
       NULL);
       if (ret &lt; 0) {
           SHOW("!out_format_context");
           exit(1);
       }
       AVIOContext *out_avio_context = NULL;
       uint8_t *out_buffer = NULL;
       uint8_t *out_avio_context_buffer = NULL;
       size_t out_buffer_size;
       size_t out_avio_context_buffer_size = 4096;
       struct buffer_data out_bd = { 0 };
       out_buffer = malloc(out_buffer_size * (sizeof(uint8_t)));

       out_bd.ptr = NULL;
       out_bd.size = 0;

       out_avio_context_buffer = av_malloc(out_avio_context_buffer_size);
       if (!out_avio_context_buffer) {
           SHOW("!out_avio_context_buffer");
           exit(1);
       }
       out_avio_context = avio_alloc_context(out_avio_context_buffer,
               out_avio_context_buffer_size, 1, NULL, NULL, &amp;write_packet,
               NULL);
       if (!out_avio_context) {
           SHOW("!out_avio_context");
           exit(1);
       }
       out_format_context->pb = out_avio_context;
       out_format_context->flags = AVFMT_FLAG_CUSTOM_IO;

       AVCodec *output_codec = avcodec_find_encoder(AV_CODEC_ID_AAC);
       if (!output_codec) {
           SHOW("!output_codec");
           exit(1);
       }

       AVStream * audio_stream;
       audio_stream = avformat_new_stream(out_format_context, output_codec);
       if (!audio_stream) {
           SHOW("Could not alloc audio stream!");
           exit(1);
       }
       audio_stream->codec->bit_rate = 97000;
       audio_stream->codec->channels = 2;
       audio_stream->codec->channel_layout = AV_CH_LAYOUT_STEREO;
       audio_stream->codec->sample_rate = 44100; // input_codec_context->sample_rate;
       audio_stream->codec->sample_fmt = AV_SAMPLE_FMT_FLTP; // output_codec->sample_fmts[0];
       /** Allow the use of the experimental AAC encoder */
       //audio_stream->codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
       /** Set the sample rate for the container. */
       audio_stream->codec->time_base.den = 44100; // input_codec_context->sample_rate;
       audio_stream->codec->time_base.num = 1;

       ret = avcodec_open2(audio_stream->codec, output_codec, NULL);
       if (ret &lt; 0) {
           SHOW("!avcodec_open2");
           exit(1);
       }
       audio_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

       printf("audio_stream->codec : %d", audio_stream->codec->codec_id);

       ret = avformat_write_header(out_format_context, NULL);
       if (ret &lt; 0) {
           SHOW("!avformat_write_header");
           exit(1);
       }

       //end encoder
       //

       //start SwrContext
       //
       AVAudioResampleContext *resample_context;
       if (!(resample_context = avresample_alloc_context())) {
           fprintf(stderr, "Could not allocate resample context\n");
           return AVERROR(ENOMEM);
       }
       av_opt_set_int(resample_context, "in_channel_layout",
               av_get_default_channel_layout(2), 0);
       av_opt_set_int(resample_context, "out_channel_layout",
               av_get_default_channel_layout(2), 0);
       av_opt_set_int(resample_context, "in_sample_rate", 44100, 0);
       av_opt_set_int(resample_context, "out_sample_rate", 44100, 0);
       av_opt_set_int(resample_context, "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
       av_opt_set_int(resample_context, "out_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);

       /* Open the resampler with the specified parameters. */
       if ((ret = avresample_open(resample_context)) &lt; 0) {
           fprintf(stderr, "Could not open resample context\n");
           avresample_free(resample_context);
           return ret;
       }

       //end SwrContext
       //

       AVFrame* decoded_frame = av_frame_alloc();

       AVPacket output_packet;
       av_init_packet(&amp;output_packet);

       AVPacket *packet = av_packet_alloc();
       /** Set the packet data and size so that it is recognized as being empty. */
       packet->data = NULL;
       packet->size = 0;

       int i = 0;
       while (1) {
           i++;
           int data_present;
           int data_present2;
           ret = av_read_frame(input_format_context, packet);
           if (ret &lt; 0 &amp;&amp; ret == AVERROR_EOF) {
               SHOW("ALL FRAME READ. EOF :)");
               break;
           } else if (ret &lt; 0) {
               SHOW("ret&lt;0");
               break;
           }
           printf("frame [ %d ] read.\n ", (i));

           ret = avcodec_decode_audio4(input_format_context->streams[0]->codec,
                   decoded_frame, &amp;data_present, packet);

           if (ret &lt; 0) {
               SHOW("!avcodec_decode_audio4");
               exit(1);
           }
           printf("frame [ %d ] decoded.\n ", (i));
           uint8_t **converted_input_samples = NULL;

           if (data_present) {

               if (init_converted_samples(&amp;converted_input_samples,
                       audio_stream->codec, decoded_frame->nb_samples))
                   return -1;

               /* Convert the input samples to the desired output sample format.
                * This requires a temporary storage provided by converted_input_samples. */
               if (convert_samples(decoded_frame->extended_data,
                       converted_input_samples, decoded_frame->nb_samples,
                       resample_context))
                   return -1;

               fwrite(*converted_input_samples, sizeof(uint8_t),
                       decoded_frame->nb_samples * sizeof(float)
                               * decoded_frame->channels, temp_file);

           }

       }
       printf("DONE \n");
       fclose(temp_file);

       temp_file = fopen("temp_file.dat", "rb");
       fseek(temp_file, 0, SEEK_END);
       buffer_size = ftell(temp_file);
       fseek(temp_file, 0, SEEK_SET);

       int ff = 1;
       int data_present;
       while (!feof(temp_file)) {
           AVFrame* encoded_frame;

           init_output_frame(&amp;encoded_frame, audio_stream->codec,
                   audio_stream->codec->frame_size);

           av_frame_make_writable(encoded_frame);
           int real_size = audio_stream->codec->frame_size
                   * encoded_frame->channels * sizeof(float);
           uint8_t *buf = malloc(real_size);

           printf("real : %d\n", real_size);
           fread(buf, real_size, sizeof(uint8_t), temp_file);

           printf("ff : %d\n", (ff));

           avcodec_fill_audio_frame(encoded_frame, 2, AV_SAMPLE_FMT_FLTP, buf,
                   real_size, 1);

           encode_audio_frame(encoded_frame, out_format_context,
                   audio_stream->codec, &amp;data_present);

           if (data_present) {
               ff++;
           }

       }
       int data_written;
       /* Flush the encoder as it may have delayed frames. */
       do {
           data_written = 0;
           encode_audio_frame(NULL, out_format_context, audio_stream->codec,
                   &amp;data_written);

       } while (data_written);
    //  av_write_trailer(out_format_context);

       return 0;
    }
  • ffmpeg C api cutting a video when packet dts is greater than pts

    10 mars 2017, par TastyCatFood

    Corrupted videos

    In trying to cut out a duration of one of videos using ffmpeg C api, using the code posted here : How to cut video with FFmpeg C API , ffmpeg spit out the log below :

    D/logger: Loop count:9   out: pts:0 pts_time:0 dts:2002 dts_time:0.0333667 duration:2002 duration_time:0.0333667 stream_index:1
    D/trim_video: Error muxing packet Invalid argument

    ffmpeg considercs an instruction to decompress a frame after presenting it to be a nonsense, which is well...reasonable but stringent.

    My VLC player finds the video alright and plays it of course.

    Note :

    The code immediately below is in c++ written to be compiled with g++ as I’m developing for android. For C code, scroll down further.

    My solution(g++) :

    extern "C" {
    #include "libavformat/avformat.h"
    #include "libavutil/mathematics.h"
    #include "libavutil/timestamp.h"



    static void log_packet(
           const AVFormatContext *fmt_ctx,
           const AVPacket *pkt, const char *tag,
           long count=0)
    {

       printf("loop count %d pts:%f dts:%f duration:%f stream_index:%d\n",
              count,
              static_cast<double>(pkt->pts),
              static_cast<double>(pkt->dts),
              static_cast<double>(pkt->duration),
              pkt->stream_index);
       return;
    }

    int trimVideo(
           const char* in_filename,
           const char* out_filename,
           double cutFrom,
           double cutUpTo)
    {
       AVOutputFormat *ofmt = NULL;
       AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
       AVPacket pkt;
       int ret, i;
       //jboolean  copy = true;
       //const char *in_filename = env->GetStringUTFChars(jstring_in_filename,&amp;copy);
       //const char *out_filename = env->GetStringUTFChars(jstring_out_filename,&amp;copy);
       long loopCount = 0;

       av_register_all();

       // Cutting may change the pts and dts of the resulting video;
       // if frames in head position are removed.
       // In the case like that, src stream's copy start pts
       // need to be recorded and is used to compute the new pts value.
       // e.g.
       //    new_pts = current_pts - trim_start_position_pts;

       // nb-streams is the number of elements in AVFormatContext.streams.
       // Initial pts value must be recorded for each stream.

       //May be malloc and memset should be replaced with [].
       int64_t *dts_start_from = NULL;
       int64_t *pts_start_from = NULL;

       if ((ret = avformat_open_input(&amp;ifmt_ctx, in_filename, 0, 0)) &lt; 0) {
           printf( "Could not open input file '%s'", in_filename);
           goto end;
       }

       if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) &lt; 0) {
           printf("Failed to retrieve input stream information");
           goto end;
       }

       av_dump_format(ifmt_ctx, 0, in_filename, 0);

       avformat_alloc_output_context2(&amp;ofmt_ctx, NULL, NULL, out_filename);
       if (!ofmt_ctx) {
           printf( "Could not create output context\n");
           ret = AVERROR_UNKNOWN;
           goto end;
       }

       ofmt = ofmt_ctx->oformat;

       //preparing streams
       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           AVStream *in_stream = ifmt_ctx->streams[i];
           AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
           if (!out_stream) {
               printf( "Failed allocating output stream\n");
               ret = AVERROR_UNKNOWN;
               goto end;
           }

           ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
           if (ret &lt; 0) {
               printf( "Failed to copy context from input to output stream codec context\n");
               goto end;
           }
           out_stream->codec->codec_tag = 0;
           if (ofmt_ctx->oformat->flags &amp; AVFMT_GLOBALHEADER)
               out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
       }
       av_dump_format(ofmt_ctx, 0, out_filename, 1);

       if (!(ofmt->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               printf( "Could not open output file '%s'", out_filename);
               goto end;
           }
       }
       //preparing the header
       ret = avformat_write_header(ofmt_ctx, NULL);
       if (ret &lt; 0) {
           printf( "Error occurred when opening output file\n");
           goto end;
       }

       // av_seek_frame translates AV_TIME_BASE into an appropriate time base.
       ret = av_seek_frame(ifmt_ctx, -1, cutFrom*AV_TIME_BASE, AVSEEK_FLAG_ANY);
       if (ret &lt; 0) {
           printf( "Error seek\n");
           goto end;
       }
       dts_start_from = static_cast(
               malloc(sizeof(int64_t) * ifmt_ctx->nb_streams));
       memset(dts_start_from, 0, sizeof(int64_t) * ifmt_ctx->nb_streams);
       pts_start_from = static_cast(
               malloc(sizeof(int64_t) * ifmt_ctx->nb_streams));
       memset(pts_start_from, 0, sizeof(int64_t) * ifmt_ctx->nb_streams);

       //writing
       while (1) {
           AVStream *in_stream, *out_stream;
           //reading frame into pkt
           ret = av_read_frame(ifmt_ctx, &amp;pkt);
           if (ret &lt; 0)
               break;
           in_stream  = ifmt_ctx->streams[pkt.stream_index];
           out_stream = ofmt_ctx->streams[pkt.stream_index];

           //if end reached
           if (av_q2d(in_stream->time_base) * pkt.pts > cutUpTo) {
               av_packet_unref(&amp;pkt);
               break;
           }


           // Recording the initial pts value for each stream
           // Recording dts does not do the trick because AVPacket.dts values
           // in some video files are larger than corresponding pts values
           // and ffmpeg does not like it.
           if (dts_start_from[pkt.stream_index] == 0) {
               dts_start_from[pkt.stream_index] = pkt.pts;
               printf("dts_initial_value: %f for stream index: %d \n",
                       static_cast<double>(dts_start_from[pkt.stream_index]),
                                   pkt.stream_index

               );
           }
           if (pts_start_from[pkt.stream_index] == 0) {
               pts_start_from[pkt.stream_index] = pkt.pts;
               printf( "pts_initial_value:  %f for stream index %d\n",
                       static_cast<double>(pts_start_from[pkt.stream_index]),
                                   pkt.stream_index);
           }

           log_packet(ifmt_ctx, &amp;pkt, "in",loopCount);

           /* Computes pts etc
            *      av_rescale_q_rend etc are countering changes in time_base between
            *      out_stream and in_stream, so regardless of time_base values for
            *      in and out streams, the rate at which frames are refreshed remains
            *      the same.
            *
                   pkt.pts = pkt.pts * (in_stream->time_base/ out_stream->time_base)
                   As `time_base == 1/frame_rate`, the above is an equivalent of

                   (out_stream_frame_rate/in_stream_frame_rate)*pkt.pts where
                   frame_rate is the number of frames to be displayed per second.

                   AV_ROUND_PASS_MINMAX may set pts or dts to AV_NOPTS_VALUE
            * */


           pkt.pts =
                   av_rescale_q_rnd(
                   pkt.pts - pts_start_from[pkt.stream_index],
                   static_cast<avrational>(in_stream->time_base),
                   static_cast<avrational>(out_stream->time_base),
                   static_cast<avrounding>(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
           pkt.dts =
                   av_rescale_q_rnd(
                   pkt.dts - dts_start_from[pkt.stream_index],
                   static_cast<avrational>(in_stream->time_base),
                   static_cast<avrational>(out_stream->time_base),
                   static_cast<avrounding>(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));

           if(pkt.dts>pkt.pts) pkt.dts = pkt.pts -1;
           if(pkt.dts &lt; 0) pkt.dts = 0;
           if(pkt.pts &lt; 0) pkt.pts = 0;

           pkt.duration = av_rescale_q(
                   pkt.duration,
                   in_stream->time_base,
                   out_stream->time_base);
           pkt.pos = -1;
           log_packet(ofmt_ctx, &amp;pkt, "out",loopCount);

           // Writes to the file after buffering packets enough to generate a frame
           // and probably sorting packets in dts order.
           ret = av_interleaved_write_frame(ofmt_ctx, &amp;pkt);
    //        ret = av_write_frame(ofmt_ctx, &amp;pkt);
           if (ret &lt; 0) {
               printf( "Error muxing packet %d \n", ret);
               //continue;
               break;
           }
           av_packet_unref(&amp;pkt);
           ++loopCount;
       }

       //Writing end code?
       av_write_trailer(ofmt_ctx);

       end:
       avformat_close_input(&amp;ifmt_ctx);

       if(dts_start_from)free(dts_start_from);
       if(pts_start_from)free(pts_start_from);

       /* close output */
       if (ofmt_ctx &amp;&amp; !(ofmt->flags &amp; AVFMT_NOFILE))
           avio_closep(&amp;ofmt_ctx->pb);
       avformat_free_context(ofmt_ctx);

       if (ret &lt; 0 &amp;&amp; ret != AVERROR_EOF) {
           //printf( "Error occurred: %s\n", av_err2str(ret));
           return 1;
       }

       return 0;
    }

    }
    </avrounding></avrational></avrational></avrounding></avrational></avrational></double></double></double></double></double>

    c compatible(Console says g++ but I’m sure this is C code)

    #include "libavformat/avformat.h"
    #include "libavutil/mathematics.h"
    #include "libavutil/timestamp.h"



    static void log_packet(
           const AVFormatContext *fmt_ctx,
           const AVPacket *pkt, const char *tag,
           long count)
    {

       printf("loop count %d pts:%f dts:%f duration:%f stream_index:%d\n",
              count,
              (double)pkt->pts,
              (double)pkt->dts,
              (double)pkt->duration,
              pkt->stream_index);
       return;
    }

    int trimVideo(
           const char* in_filename,
           const char* out_filename,
           double cutFrom,
           double cutUpTo)
    {
       AVOutputFormat *ofmt = NULL;
       AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
       AVPacket pkt;
       int ret, i;
       //jboolean  copy = true;
       //const char *in_filename = env->GetStringUTFChars(jstring_in_filename,&amp;copy);
       //const char *out_filename = env->GetStringUTFChars(jstring_out_filename,&amp;copy);
       long loopCount = 0;

       av_register_all();

       // Cutting may change the pts and dts of the resulting video;
       // if frames in head position are removed.
       // In the case like that, src stream's copy start pts
       // need to be recorded and is used to compute the new pts value.
       // e.g.
       //    new_pts = current_pts - trim_start_position_pts;

       // nb-streams is the number of elements in AVFormatContext.streams.
       // Initial pts value must be recorded for each stream.

       //May be malloc and memset should be replaced with [].
       int64_t *dts_start_from = NULL;
       int64_t *pts_start_from = NULL;

       if ((ret = avformat_open_input(&amp;ifmt_ctx, in_filename, 0, 0)) &lt; 0) {
           printf( "Could not open input file '%s'", in_filename);
           goto end;
       }

       if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) &lt; 0) {
           printf("Failed to retrieve input stream information");
           goto end;
       }

       av_dump_format(ifmt_ctx, 0, in_filename, 0);

       avformat_alloc_output_context2(&amp;ofmt_ctx, NULL, NULL, out_filename);
       if (!ofmt_ctx) {
           printf( "Could not create output context\n");
           ret = AVERROR_UNKNOWN;
           goto end;
       }

       ofmt = ofmt_ctx->oformat;

       //preparing streams
       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           AVStream *in_stream = ifmt_ctx->streams[i];
           AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
           if (!out_stream) {
               printf( "Failed allocating output stream\n");
               ret = AVERROR_UNKNOWN;
               goto end;
           }

           ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
           if (ret &lt; 0) {
               printf( "Failed to copy context from input to output stream codec context\n");
               goto end;
           }
           out_stream->codec->codec_tag = 0;
           if (ofmt_ctx->oformat->flags &amp; AVFMT_GLOBALHEADER)
               out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
       }
       av_dump_format(ofmt_ctx, 0, out_filename, 1);

       if (!(ofmt->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               printf( "Could not open output file '%s'", out_filename);
               goto end;
           }
       }
       //preparing the header
       ret = avformat_write_header(ofmt_ctx, NULL);
       if (ret &lt; 0) {
           printf( "Error occurred when opening output file\n");
           goto end;
       }

       // av_seek_frame translates AV_TIME_BASE into an appropriate time base.
       ret = av_seek_frame(ifmt_ctx, -1, cutFrom*AV_TIME_BASE, AVSEEK_FLAG_ANY);
       if (ret &lt; 0) {
           printf( "Error seek\n");
           goto end;
       }
       dts_start_from = (int64_t*)
               malloc(sizeof(int64_t) * ifmt_ctx->nb_streams);
       memset(dts_start_from, 0, sizeof(int64_t) * ifmt_ctx->nb_streams);
       pts_start_from = (int64_t*)
               malloc(sizeof(int64_t) * ifmt_ctx->nb_streams);
       memset(pts_start_from, 0, sizeof(int64_t) * ifmt_ctx->nb_streams);

       //writing
       while (1) {
           AVStream *in_stream, *out_stream;
           //reading frame into pkt
           ret = av_read_frame(ifmt_ctx, &amp;pkt);
           if (ret &lt; 0)
               break;
           in_stream  = ifmt_ctx->streams[pkt.stream_index];
           out_stream = ofmt_ctx->streams[pkt.stream_index];

           //if end reached
           if (av_q2d(in_stream->time_base) * pkt.pts > cutUpTo) {
               av_packet_unref(&amp;pkt);
               break;
           }


           // Recording the initial pts value for each stream
           // Recording dts does not do the trick because AVPacket.dts values
           // in some video files are larger than corresponding pts values
           // and ffmpeg does not like it.
           if (dts_start_from[pkt.stream_index] == 0) {
               dts_start_from[pkt.stream_index] = pkt.pts;
               printf("dts_initial_value: %f for stream index: %d \n",
                       (double)dts_start_from[pkt.stream_index],
                                   pkt.stream_index

               );
           }
           if (pts_start_from[pkt.stream_index] == 0) {
               pts_start_from[pkt.stream_index] = pkt.pts;
               printf( "pts_initial_value:  %f for stream index %d\n",
                       (double)pts_start_from[pkt.stream_index],
                                   pkt.stream_index);
           }

           log_packet(ifmt_ctx, &amp;pkt, "in",loopCount);

           /* Computes pts etc
            *      av_rescale_q_rend etc are countering changes in time_base between
            *      out_stream and in_stream, so regardless of time_base values for
            *      in and out streams, the rate at which frames are refreshed remains
            *      the same.
            *
                   pkt.pts = pkt.pts * (in_stream->time_base/ out_stream->time_base)
                   As `time_base == 1/frame_rate`, the above is an equivalent of

                   (out_stream_frame_rate/in_stream_frame_rate)*pkt.pts where
                   frame_rate is the number of frames to be displayed per second.

                   AV_ROUND_PASS_MINMAX may set pts or dts to AV_NOPTS_VALUE
            * */


           pkt.pts =
                   av_rescale_q_rnd(
                   pkt.pts - pts_start_from[pkt.stream_index],
                   (AVRational)in_stream->time_base,
                   (AVRational)out_stream->time_base,
                   (AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
           pkt.dts =
                   av_rescale_q_rnd(
                   pkt.dts - dts_start_from[pkt.stream_index],
                   (AVRational)in_stream->time_base,
                   (AVRational)out_stream->time_base,
                   AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);

           if(pkt.dts>pkt.pts) pkt.dts = pkt.pts -1;
           if(pkt.dts &lt; 0) pkt.dts = 0;
           if(pkt.pts &lt; 0) pkt.pts = 0;

           pkt.duration = av_rescale_q(
                   pkt.duration,
                   in_stream->time_base,
                   out_stream->time_base);
           pkt.pos = -1;
           log_packet(ofmt_ctx, &amp;pkt, "out",loopCount);

           // Writes to the file after buffering packets enough to generate a frame
           // and probably sorting packets in dts order.
           ret = av_interleaved_write_frame(ofmt_ctx, &amp;pkt);
    //        ret = av_write_frame(ofmt_ctx, &amp;pkt);
           if (ret &lt; 0) {
               printf( "Error muxing packet %d \n", ret);
               //continue;
               break;
           }
           av_packet_unref(&amp;pkt);
           ++loopCount;
       }

       //Writing end code?
       av_write_trailer(ofmt_ctx);

       end:
       avformat_close_input(&amp;ifmt_ctx);

       if(dts_start_from)free(dts_start_from);
       if(pts_start_from)free(pts_start_from);

       /* close output */
       if (ofmt_ctx &amp;&amp; !(ofmt->flags &amp; AVFMT_NOFILE))
           avio_closep(&amp;ofmt_ctx->pb);
       avformat_free_context(ofmt_ctx);

       if (ret &lt; 0 &amp;&amp; ret != AVERROR_EOF) {
           //printf( "Error occurred: %s\n", av_err2str(ret));
           return 1;
       }

       return 0;
    }

    What is the problem

    My code does not produce the error because I’m doing new_dts = current_dts - initial_pts_for_current_stream. It works but now dts values are not properly computed.

    How to recalculate dts properly ?

    P.S

    Since Olaf seems to have a very strong opinion, posting the build console message for my main.c.
    I don’t really know C or C++ but GNU gcc seems to be calling gcc for compiling and g++ for linking.
    Well, the extension for my main is now .c and the compiler being called is gcc, so that should at least mean I have got a code written in C language...

    ------------- Build: Debug in videoTrimmer (compiler: GNU GCC Compiler)---------------

    gcc -Wall -fexceptions -std=c99 -g -I/home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include -I/usr/include -I/usr/local/include -c /home/d/CodeBlockWorkplace/videoTrimmer/main.c -o obj/Debug/main.o
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c: In function ‘log_packet’:
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
        printf("loop count %d pts:%f dts:%f duration:%f stream_index:%d\n",
               ^
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c: In function ‘trimVideo’:
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:79:9: warning: ‘codec’ is deprecated [-Wdeprecated-declarations]
            AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
            ^
    In file included from /home/d/CodeBlockWorkplace/videoTrimmer/main.c:3:0:
    /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavformat/avformat.h:893:21: note: declared here
        AVCodecContext *codec;
                        ^
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:86:9: warning: ‘avcodec_copy_context’ is deprecated [-Wdeprecated-declarations]
            ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
            ^
    In file included from /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavformat/avformat.h:319:0,
                    from /home/d/CodeBlockWorkplace/videoTrimmer/main.c:3:
    /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavcodec/avcodec.h:4286:5: note: declared here
    int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
        ^
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:86:9: warning: ‘codec’ is deprecated [-Wdeprecated-declarations]
            ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
            ^
    In file included from /home/d/CodeBlockWorkplace/videoTrimmer/main.c:3:0:
    /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavformat/avformat.h:893:21: note: declared here
        AVCodecContext *codec;
                        ^
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:86:9: warning: ‘codec’ is deprecated [-Wdeprecated-declarations]
            ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
            ^
    In file included from /home/d/CodeBlockWorkplace/videoTrimmer/main.c:3:0:
    /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavformat/avformat.h:893:21: note: declared here
        AVCodecContext *codec;
                        ^
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:91:9: warning: ‘codec’ is deprecated [-Wdeprecated-declarations]
            out_stream->codec->codec_tag = 0;
            ^
    In file included from /home/d/CodeBlockWorkplace/videoTrimmer/main.c:3:0:
    /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavformat/avformat.h:893:21: note: declared here
        AVCodecContext *codec;
                        ^
    /home/d/CodeBlockWorkplace/videoTrimmer/main.c:93:13: warning: ‘codec’ is deprecated [-Wdeprecated-declarations]
                out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
                ^
    In file included from /home/d/CodeBlockWorkplace/videoTrimmer/main.c:3:0:
    /home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/include/libavformat/avformat.h:893:21: note: declared here
        AVCodecContext *codec;
                        ^
    g++ -L/home/d/Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib -L/usr/lib -L/usr/local/lib -o bin/Debug/videoTrimmer obj/Debug/main.o   ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libavformat.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libavcodec.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libavutil.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libswresample.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libswscale.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libavfilter.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libpostproc.a ../../Android/Sdk/ndk-bundle/sources/FFmpeg/local/lib/libavdevice.a -lX11 -lvdpau -lva -lva-drm -lva-x11 -ldl -lpthread -lz -llzma -lx264
    Output file is bin/Debug/videoTrimmer with size 77.24 MB
    Process terminated with status 0 (0 minute(s), 16 second(s))
    0 error(s), 8 warning(s) (0 minute(s), 16 second(s))