Newest 'ffmpeg' Questions - Stack Overflow

http://stackoverflow.com/questions/tagged/ffmpeg

Les articles publiés sur le site

  • How do I make libavformat reconnect when connection is reset by peer ?

    6 mai, par user24897675

    I am opening a network file via HTTPS like this:

    avformat_open_input(&m_format, "https://www.example.com/file.mp4", nullptr, nullptr);
    

    It works, however sometimes connection is closed and this is logged:

    [tls @ 0x7f600ba690] Error in the pull function.
    [tls @ 0x7f600ba690] IO error: Connection reset by peer
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f6007e450] Packet corrupt (stream = 0, dts = 24188928).
    [aac @ 0x7f60324800] Input buffer exhausted before END element found
    

    I found it possible to setup reconnection by logs from this post. Here are their logs:

    [tls @ 0x6e3b440] Error in the pull function.
    [tls @ 0x6e3b440] IO error: Connection reset by peer
    [https @ 0x6e37900] Will reconnect at 720896 in 0 second(s), error=Connection reset by peer.
    

    Here libavformat does not give up and it tries to reconnect because -reconnect argument was passed in FFmpeg CLI. How can I do the same in code with FFmpeg's libavformat?

  • Multiple fadeIn/fadeOut effects in one audio file with ffmpeg

    6 mai, par farw

    I have some problem to add several fade effects to one audio file. When I try to use a command like this:

    ffmpeg -y -i /home/user/video/test/sound.mp3 -af "afade=t=in:ss=0:d=3,afade=t=out:st=7:d=3,afade=t=in:st=10:d=3,afade=t=out:st=17:d=3,afade=t=in:st=20:d=3,afade=t=out:st=27:d=3" /tmp/test.mp3
    

    then my output audio file has a fadein and fadeout applied only once. All the next effects don't get applied. Is there any possible way to apply several fade effects to the same audio file? Also, what is the difference between ss and st parameter in this command?

  • How to set "ch_layout" in ffmpeg 6.1 ?

    6 mai, par Steven porite

    In 6.1 Ffmpeg, it use "ch_layout" to replace the "channel_layout" and "number". The "ch_layout" is "AVChannelLayout *" type. This type is defined in channel_layout.h, some kind of "ch_layout" is defined in this file too. If I want to use the "av_dict_set_int()" set the "ch_layout" to "AV_CHANNEL_LAYOUT_STEREO", what should I fill to the "value"?

    /**
     * Macro to define native channel layouts
     *
     * @note This doesn't use designated initializers for compatibility with C++ 17 and older.
     */
    #define AV_CHANNEL_LAYOUT_MASK(nb, m) \
        { /* .order */ AV_CHANNEL_ORDER_NATIVE, \
          /* .nb_channels */  (nb), \
          /* .u.mask */ { m }, \
          /* .opaque */ NULL }
    
    /**
     * @name Common pre-defined channel layouts
     * @{
     */
    #define AV_CHANNEL_LAYOUT_MONO              AV_CHANNEL_LAYOUT_MASK(1,  AV_CH_LAYOUT_MONO)
    #define AV_CHANNEL_LAYOUT_STEREO            AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO)
    #define AV_CHANNEL_LAYOUT_2POINT1           AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2POINT1)
    #define AV_CHANNEL_LAYOUT_2_1               AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2_1)
    
    /**
     * Convenience wrapper for av_dict_set() that converts the value to a string
     * and stores it.
     *
     * Note: If ::AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error.
     */
    int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags);
    
  • FFMPEG transcoding as 59.979960 fps instead of 60 fps

    6 mai, par RJQ

    I am transcoding an image sequence to a 10 frame 60fps .mov files using the first command below. I am then concatenating the exported videos using the second command below.

    Transcode ffmpeg -y -r 60 -probesize 13M -start_number 1001 -i 'input_video.%04d.jpeg' -c:v libx265 -pix_fmt yuv420p10le -crf 28 -preset slower -tag:v hvc1 -vf lut3d='output_lut.cube' -r 60 -frames:v 10 -movflags faststart output_video_0001.mov

    Concatenate ffmpeg -y -f concat -safe 0 -i input_concat_list.txt -c copy output_concat.mov

    I expected the final file from the concatenated videos to be 60fps. I am using the -r flag twice, so it sets the input frame rate for the image sequence and then making sure the output is 60fps as well. After the transcode the resulting chunks are each 60fps. After the concatenation though, when checking the frame rate in VLC, instead of the desired 60fps VLC is showing the resulting video is 59.979960. I tried using the frame rate flag when concatenating, but that didn't help.

  • Error transcoding with FFmpeg : Error : Output format hls is not available

    6 mai, par asif mohmd

    I am using FFmpeg library to transcode a video file into multiple resolutions and create an HLS (HTTP Live Streaming) master playlist.

    It takes a video file as input but its does give me the output with HLS playlist.I got a error called "Output format hls is not available". Only the Output directory is creating

    I am using FFMpeg 7.0 full build version and also tried older versions and ffmpeg essentials and also tried chocolatey.

    if i remove the implementation of HLS from this code.it will create 4 different resolution videos in my output.

    Note:I just tried this same code on my friend MAC Book by only changing the setffmpegPath: "ffmpeg.setFfmpegPath("C:\ffmpeg\bin\ffmpeg.exe");" to his ffmpeg directory. Its working perfectly in his mac book

    import "dotenv/config";
    import * as fs from "fs";
    import * as path from "path";
    import ffmpeg from "fluent-ffmpeg";
    import crypto from "crypto";
    
    ffmpeg.setFfmpegPath("C:\\ffmpeg\\bin\\ffmpeg.exe");
    
    export const FFmpegTranscoder = async (file: any): Promise => {
      try {
        console.log("Starting script");
        console.time("req_time");
    
        const randomName = (bytes = 32) =>
          crypto.randomBytes(bytes).toString("hex");
        const fileName = randomName();
        const directoryPath = path.join(__dirname, "..", "..", "input");
        const filePath = path.join(directoryPath, `${fileName}.mp4`);
    
        if (!fs.existsSync(directoryPath)) {
          fs.mkdirSync(directoryPath, { recursive: true });
        }
    
        const paths = await new Promise((resolve, reject) => {
          fs.writeFile(filePath, file, async (err) => {
            if (err) {
              console.error("Error saving file:", err);
              throw err;
            }
            console.log("File saved successfully:", filePath);
    
            try {
              const outputDirectoryPath = await transcodeWithFFmpeg(
                fileName,
                filePath
              );
              resolve({ directoryPath, filePath, fileName, outputDirectoryPath });
            } catch (error) {
              console.error("Error transcoding with FFmpeg:", error);
            }
          });
        });
        return paths;
      } catch (e: any) {
        console.log(e);
      }
    };
    
    const transcodeWithFFmpeg = async (fileName: string, filePath: string) => {
      const directoryPath = path.join(
        __dirname,
        "..",
        "..",
        `output/hls/${fileName}`
      );
    
      if (!fs.existsSync(directoryPath)) {
        fs.mkdirSync(directoryPath, { recursive: true });
      }
    
      const resolutions = [
        {
          resolution: "256x144",
          videoBitrate: "200k",
          audioBitrate: "64k",
        },
        {
          resolution: "640x360",
          videoBitrate: "800k",
          audioBitrate: "128k",
        },
        {
          resolution: "1280x720",
          videoBitrate: "2500k",
          audioBitrate: "192k",
        },
        {
          resolution: "1920x1080",
          videoBitrate: "5000k",
          audioBitrate: "256k",
        },
      ];
    
      const variantPlaylists: { resolution: string; outputFileName: string }[] = [];
    
      for (const { resolution, videoBitrate, audioBitrate } of resolutions) {
        console.log(`HLS conversion starting for ${resolution}`);
        const outputFileName = `${fileName}_${resolution}.m3u8`;
        const segmentFileName = `${fileName}_${resolution}_%03d.ts`;
    
        await new Promise((resolve, reject) => {
          ffmpeg(filePath)
            .outputOptions([
              `-c:v h264`,
              `-b:v ${videoBitrate}`,
              `-c:a aac`,
              `-b:a ${audioBitrate}`,
              `-vf scale=${resolution}`,
              `-f hls`,
              `-hls_time 10`,
              `-hls_list_size 0`,
              `-hls_segment_filename ${directoryPath}/${segmentFileName}`,
            ])
            .output(`${directoryPath}/${outputFileName}`)
            .on("end", () => resolve())
            .on("error", (err) => reject(err))
            .run();
        });
        const variantPlaylist = {
          resolution,
          outputFileName,
        };
        variantPlaylists.push(variantPlaylist);
        console.log(`HLS conversion done for ${resolution}`);
      }
      console.log(`HLS master m3u8 playlist generating`);
    
      let masterPlaylist = variantPlaylists
        .map((variantPlaylist) => {
          const { resolution, outputFileName } = variantPlaylist;
          const bandwidth =
            resolution === "256x144"
              ? 264000
              : resolution === "640x360"
              ? 1024000
              : resolution === "1280x720"
              ? 3072000
              : 5500000;
          ``;
          return `#EXT-X-STREAM-INF:BANDWIDTH=${bandwidth},RESOLUTION=${resolution}\n${outputFileName}`;
        })
        .join("\n");
      masterPlaylist = `#EXTM3U\n` + masterPlaylist;
    
      const masterPlaylistFileName = `${fileName}_master.m3u8`;
    
      const masterPlaylistPath = `${directoryPath}/${masterPlaylistFileName}`;
      fs.writeFileSync(masterPlaylistPath, masterPlaylist);
      console.log(`HLS master m3u8 playlist generated`);
      return directoryPath;
    };
    

    My console.log is:

        Starting script
        HLS conversion starting for 256x144
        Error transcoding with FFmpeg: Error: Output format hls is not available
            at C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\fluent-ffmpeg\lib\capabilities.js:589:21
            at nextTask (C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\async\dist\async.js:5791:13)
            at next (C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\async\dist\async.js:5799:13)
            at C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\async\dist\async.js:329:20
            at C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\fluent-ffmpeg\lib\capabilities.js:549:7
            at handleExit (C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\fluent-ffmpeg\lib\processor.js:170:11)
            at ChildProcess. (C:\Users\asifa\Desktop\Genius Grid\Transcode-service\node_modules\fluent-ffmpeg\lib\processor.js:184:11)
            at ChildProcess.emit (node:events:518:28)
            at ChildProcess.emit (node:domain:488:12)
            at Process.ChildProcess._handle.onexit (node:internal/child_process:294:12) 
    

    I am using Windows 11 and FFMpeg version 7.0. I repeatedly checked, using CMD commands, that my FFMpeg was installed correctly and confirmed the environment variables path, experimented with various FFMpeg versions, and tried with FFMpeg full build Chocolatey package.

    In Command Line its working perfectly:

    PS C:\Users\asifa\Desktop\test fmmpeg> ffmpeg -hide_banner -y -i .\SampleVideo_1280x720_30mb.mp4 -vf scale=w=640:h=360:force_original_aspect_ratio=decrease -c:a aac -b:v 800k -c:v h264 -b:a 128k -f hls -hls_time 14 -hls_list_size 0 -hls_segment_filename beach/480p_%03d.ts beach/480p.m3u8
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\SampleVideo_1280x720_30mb.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        creation_time   : 1970-01-01T00:00:00.000000Z
        encoder         : Lavf53.24.2
      Duration: 00:02:50.86, start: 0.000000, bitrate: 1474 kb/s
      Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 1086 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
          Metadata:
            creation_time   : 1970-01-01T00:00:00.000000Z
            handler_name    : VideoHandler
            vendor_id       : [0][0][0][0]
      Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s (default)
          Metadata:
            creation_time   : 1970-01-01T00:00:00.000000Z
            handler_name    : SoundHandler
            vendor_id       : [0][0][0][0]
    Stream mapping:
      Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
      Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    Press [q] to stop, [?] for help
    [libx264 @ 000001ef1288ec00] using SAR=1/1
    [libx264 @ 000001ef1288ec00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
    [libx264 @ 000001ef1288ec00] profile High, level 3.0, 4:2:0, 8-bit
    [libx264 @ 000001ef1288ec00] 264 - core 164 r3190 7ed753b - H.264/MPEG-4 AVC codec - Copyleft 2003-2024 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=11 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=abr mbtree=1 bitrate=800 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, hls, to 'beach/480p.m3u8':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf61.1.100
      Stream #0:0(und): Video: h264, yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=2-31, 800 kb/s, 25 fps, 90k tbn (default)
          Metadata:
            creation_time   : 1970-01-01T00:00:00.000000Z
            handler_name    : VideoHandler
            vendor_id       : [0][0][0][0]
            encoder         : Lavc61.3.100 libx264
          Side data:
            cpb: bitrate max/min/avg: 0/0/800000 buffer size: 0 vbv_delay: N/A
      Stream #0:1(und): Audio: aac (LC), 48000 Hz, 5.1, fltp, 128 kb/s (default)
          Metadata:
            creation_time   : 1970-01-01T00:00:00.000000Z
            handler_name    : SoundHandler
            vendor_id       : [0][0][0][0]
            encoder         : Lavc61.3.100 aac
    [hls @ 000001ef12482040] Opening 'beach/480p_000.ts' for writing speed=15.5x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_001.ts' for writing speed=17.9x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_002.ts' for writing speed=17.3x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_003.ts' for writing speed=19.4x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_004.ts' for writing speed=19.3x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_005.ts' for writing speed=19.2x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_006.ts' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_007.ts' for writing speed=19.4x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_008.ts' for writing speed=19.5x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_009.ts' for writing speed=19.5x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_010.ts' for writing speed=19.4x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [hls @ 000001ef12482040] Opening 'beach/480p_011.ts' for writing/A    =19.4x
    [hls @ 000001ef12482040] Opening 'beach/480p.m3u8.tmp' for writing
    [out#0/hls @ 000001ef11d4e880] video:17094KiB audio:2680KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
    frame= 4271 fps=485 q=-1.0 Lsize=N/A time=00:02:50.76 bitrate=N/A speed=19.4x
    [libx264 @ 000001ef1288ec00] frame I:45    Avg QP:10.29  size: 60418
    [libx264 @ 000001ef1288ec00] frame P:1914  Avg QP:14.53  size:  5582
    [libx264 @ 000001ef1288ec00] frame B:2312  Avg QP:20.63  size:  1774
    [libx264 @ 000001ef1288ec00] consecutive B-frames: 22.9% 11.9%  8.6% 56.6%
    [libx264 @ 000001ef1288ec00] mb I  I16..4: 15.6% 32.1% 52.2%
    [libx264 @ 000001ef1288ec00] mb P  I16..4:  0.3%  3.4%  1.2%  P16..4: 20.3% 10.0% 13.1%  0.0%  0.0%    skip:51.8%
    [libx264 @ 000001ef1288ec00] mb B  I16..4:  0.1%  0.9%  0.4%  B16..8: 17.2%  5.6%  2.8%  direct: 2.0%  skip:71.0%  L0:41.5% L1:44.1% BI:14.4%
    [libx264 @ 000001ef1288ec00] final ratefactor: 16.13
    [libx264 @ 000001ef1288ec00] 8x8 transform intra:58.4% inter:51.7%
    [libx264 @ 000001ef1288ec00] coded y,uvDC,uvAC intra: 86.7% 94.3% 78.8% inter: 12.6% 15.0% 4.5%
    [libx264 @ 000001ef1288ec00] i16 v,h,dc,p: 17% 42% 14% 28%
    [libx264 @ 000001ef1288ec00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 19% 11%  6%  7%  8%  8%  9%  9%
    [libx264 @ 000001ef1288ec00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 18% 12%  6%  9%  9%  8%  8%  7%
    [libx264 @ 000001ef1288ec00] i8c dc,h,v,p: 44% 24% 20% 12%
    [libx264 @ 000001ef1288ec00] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 000001ef1288ec00] ref P L0: 78.3%  9.7%  8.8%  3.2%
    [libx264 @ 000001ef1288ec00] ref B L0: 92.5%  6.0%  1.5%
    [libx264 @ 000001ef1288ec00] ref B L1: 97.1%  2.9%
    [libx264 @ 000001ef1288ec00] kb/s:819.63
    [aac @ 000001ef128f7c80] Qavg: 452.137
    

    When I use the .on('start', (cmdline) => console.log(cmdline))} code with the -f hls command, the error "Output format hls is not available" appears, as previously mentioned. But my Console.log looks like this if I run my code without using -f hls command:

    Without -f hls command

    await new Promise((resolve, reject) => {
      ffmpeg(filePath)
        .outputOptions([
          `-c:v h264`,
          `-b:v ${videoBitrate}`,
          `-c:a aac`,
          `-b:a ${audioBitrate}`,
          `-vf scale=${resolution}`,
     
          `-hls_time 10`,
          `-hls_list_size 0`,
          `-hls_segment_filename ${directoryPath}/${segmentFileName}`,
        ])
        .output(`${directoryPath}/${outputFileName}`)
        .on('start', (cmdline) => console.log(cmdline)) 
        .on("end", () => resolve())
        .on("error", (err) => reject(err))
        .run();
    });
    

    Console.log is:

    `Starting script
    File saved successfully: C:\Users\asifa\Desktop\Genius Grid\Transcode-service\input\c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1.mp4
    HLS conversion starting for 256x144
    ffmpeg -i C:\Users\asifa\Desktop\Genius Grid\Transcode-service\input\c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1.mp4 -y -c:v h264 -b:v 200k -c:a aac -b:a 64k -vf scale=256x144 -hls_time 10 -hls_list_size 0 -hls_segment_filename C:\Users\asifa\Desktop\Genius Grid\Transcode-service\output\hls\c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1/c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1_256x144_%03d.ts C:\Users\asifa\Desktop\Genius Grid\Transcode-service\output\hls\c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1/c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1_256x144.m3u8
    Error transcoding with FFmpeg: Error: ffmpeg exited with code 2880417800: Unrecognized option 'hls_segment_filename C:\Users\asifa\Desktop\Genius Grid\Transcode-service\output\hls\c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1/c9fcf43726e617a295b203d5acb7b81658b5f05f80eafc74cee21b053422fef1_256x144_%03d.ts'.
    Error splitting the argument list: Option not found`