最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS利用ffmpeg和sharp玩轉(zhuǎn)音視頻和圖片

 更新時間:2023年10月24日 10:16:34   作者:Moment  
ffmpeg?是一個非常流行的開源軟件套件,用于處理音頻和視頻數(shù)據(jù),而要想對圖片之類的進(jìn)行壓縮,我們可以選擇?sharp?來進(jìn)行操作,所以下面我們就來學(xué)習(xí)一下前端如何利用ffmpeg和sharp玩轉(zhuǎn)音視頻和圖片吧

前端時間剛從 windows 上切換過去 mac 進(jìn)行開發(fā),我想找一個能錄制 gif 的軟件,但是發(fā)現(xiàn)并沒有比較好的軟件,有的都是收費(fèi)的。

在 mac 上自帶的錄屏倒是挺不錯的,所以我就想有沒有什么辦法可以將這些視頻的格式轉(zhuǎn)換為 gif 格式的。

可能是因為并不是很剛需吧,并沒有去找解決方案,直到我今天刷到了一篇文章,我就大概看了一下。

使用 ffmpeg 將視頻轉(zhuǎn) GIF 格式

在開始之前我們大概來了解一下什么是 ffmpeg。

ffmpeg 是一個非常流行的開源軟件套件,用于處理音頻和視頻數(shù)據(jù)。它提供了多種工具集,如 ffmpeg、ffplayffprobe,這些工具可以用于:

  • 轉(zhuǎn)碼:可以將視頻和音頻從一種格式轉(zhuǎn)換為另一種格式。
  • 播放:使用 ffplay 可以播放多種格式的音頻和視頻文件。
  • 提取信息:使用 ffprobe 可以獲取關(guān)于音頻和視頻文件的詳細(xì)信息。
  • 流處理:可以捕獲和編碼實時音頻/視頻流。
  • 過濾:可以應(yīng)用各種過濾器來處理音頻和視頻數(shù)據(jù),例如調(diào)整亮度、裁剪、調(diào)整速度等。

ffmpeg 支持多種音頻、視頻、字幕和其他相關(guān)媒體數(shù)據(jù)的格式,它的功能非常豐富且靈活,可以滿足許多媒體處理的需求。由于其強(qiáng)大的功能和開源的特性,ffmpeg 在多個平臺和應(yīng)用程序中得到了廣泛的應(yīng)用。

大概了解了之后,我們來看看如何在 node 中實現(xiàn)視頻轉(zhuǎn) webp 的,首先安裝相關(guān)的依賴包:

pnpm add @ffmpeg-installer/ffmpeg fluent-ffmpeg

然后編寫一下代碼:

const ffmpegPath = require("@ffmpeg-installer/ffmpeg").path;
const ffmpeg = require("fluent-ffmpeg");

const video2Gif = async (videoPath, gifPath, width, fps) => {
  ffmpeg.setFfmpegPath(ffmpegPath); // 設(shè)置二進(jìn)制客戶端路徑
  ffmpeg(videoPath) // 讀入路徑
    .outputOptions("-pix_fmt", "rgb24") // 設(shè)置像素格式為rgb24
    .output(gifPath) // 輸出路徑
    .withFPS(fps) // 設(shè)置輸出GIF的幀率
    .size(`${width}x?`) // 設(shè)置輸出GIF的寬度,高度等比縮放
    .noAudio() // 禁用音頻輸出
    .setStartTime("00:00:10") // 開始時間
    .setDuration(15) // 持續(xù)時間
    .videoFilters({
      filter: "crop",
      options: {
        out_w: `iw/1.5`, // 裁剪到原始寬度
        out_h: "ih", // 高度保持不變
        x: "(iw-out_w)/2", // 從中心開始裁剪
        y: 0, // y坐標(biāo)保持在頂部
      },
    })
    .on("end", () => {
      console.log("轉(zhuǎn)換完成!");
    })
    .on("error", (err) => console.error(err))
    .run();
};

video2Gif("./i.mp4", "./index.gif", 600, 80);

這段代碼利用 ffmpeg 將一個視頻文件的特定 15 秒段落(從 10 秒開始)轉(zhuǎn)換為 GIF 格式。在轉(zhuǎn)換過程中,視頻的寬度被裁剪到其原始的 2/3,高度保持不變,同時移除了音頻部分。最后,生成的 GIF 保存到指定的路徑。

這個時候我們使用 node 運(yùn)行該文件,內(nèi)容變輸出了。查看文件大小的時候,我們發(fā)現(xiàn)文件太大了,雖然我們可以在上面調(diào)整參數(shù),但是我偏不哈哈哈哈哈,我就要倔

使用 sharp 壓縮 gif

要想對圖片之類的進(jìn)行壓縮,我們可以選擇 sharp 來進(jìn)行操作,這里我就不過多說了,直接上代碼:

const sharp = require("sharp");
const fs = require("fs");

async function compressGif(filePath, outputPath) {
  const data = await sharp(filePath, {
    animated: true,
    limitInputPixels: false,
  })
    .gif({
      colours: 60,
    })
    .toBuffer();

  // 寫入Buffer到文件
  fs.writeFileSync(outputPath, data);
}

compressGif("./index.gif", "./php.gif");

上面這段代碼使用 sharp 庫對 GIF 文件進(jìn)行壓縮,將其顏色范圍減少到 60 fps,從而減小文件大小。壓縮后的數(shù)據(jù)被保存為一個 Buffer,然后寫入到新的 GIF 文件路徑。

這個時候,gif 被我們壓縮到了 20mb 了,也終于能在掘金上面上傳了。

將任何格式的圖片轉(zhuǎn)換為 webp 格式并添加水印

WebP 是 Google 開發(fā)的圖片格式,它提供比 JPEG 和 PNG 更高效的壓縮,從而達(dá)到更小的文件大小而不犧牲圖像質(zhì)量。同時,它支持透明度和動畫,且得到了大多數(shù)現(xiàn)代瀏覽器的支持,使其成為網(wǎng)站和應(yīng)用中優(yōu)化圖像性能的理想選擇。

在下面,我們就來使用 sharp 來實現(xiàn)這種轉(zhuǎn)換,如下代碼所示:

const sharp = require("sharp");
const fs = require("fs");
const path = require("path");

const sourceDirectory = "./image";
const outputDirectory = "./webp_images";

if (!fs.existsSync(outputDirectory)) {
  fs.mkdirSync(outputDirectory);
}

fs.readdir(sourceDirectory, (err, files) => {
  if (err) {
    console.error("Error reading the directory:", err);
    return;
  }

  files.forEach((file) => {
    const extname = path.extname(file).toLowerCase();
    const filename = path.basename(file, extname);

    const allowedFormats = [
      ".jpg",
      ".jpeg",
      ".png",
      ".tif",
      ".tiff",
      ".bmp",
      ".gif",
    ];

    if (allowedFormats.includes(extname)) {
      const inputFile = path.join(sourceDirectory, file);
      const outputFile = path.join(outputDirectory, `${filename}.webp`);

      const watermarkSvg = `
                <svg width="200" height="80" xmlns="http://www.w3.org/2000/svg">
                    <text x="10" y="40" font-family="Arial" font-size="30" fill="pink" stroke="black" stroke-width="2">Moment</text>
                </svg>
            `;

      sharp(inputFile)
        .webp()
        .composite([
          {
            input: Buffer.from(watermarkSvg),
            gravity: "southeast",
          },
        ])
        .toFile(outputFile, (err, info) => {
          if (err) {
            console.error(`Failed to convert and watermark ${file}:`, err);
          } else {
            console.log(`Converted and watermarked ${file} to WebP format.`);
          }
        });
    }
  });
});

在上面這段代碼從一個指定的文件夾中讀取圖片,將其轉(zhuǎn)換為 WebP 格式并添加一個 SVG 水印在右下角,然后保存轉(zhuǎn)換后的圖片到另一個文件夾中。

最終輸出結(jié)果如下圖所示:

水印也被加上去了。

總結(jié)

通過巧妙地利用這兩者,我們可以做到平時很多我們平時想做的事情,發(fā)揮你的想象,去做一些有意義有想法的事情吧。

到此這篇關(guān)于JS利用ffmpeg和sharp玩轉(zhuǎn)音視頻和圖片的文章就介紹到這了,更多相關(guān)JS ffmpeg sharp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript獲取當(dāng)前頁面url參數(shù)的方法詳解

    JavaScript獲取當(dāng)前頁面url參數(shù)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了前端獲取當(dāng)前頁面url參數(shù)的一些常見方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 小程序?qū)崿F(xiàn)搜索框功能

    小程序?qū)崿F(xiàn)搜索框功能

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)搜索框功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • JavaScript 中的 Symbol 特性及屬性詳解

    JavaScript 中的 Symbol 特性及屬性詳解

    Symbol是ES6引入的一種獨(dú)特且強(qiáng)大的原始數(shù)據(jù)類型,具有獨(dú)一無二性、不可枚舉性等特性,適用于模擬私有屬性、定義常量、元編程等場景,JavaScript提供了相應(yīng)的方法來操作Symbol屬性,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 微信小程序利用canvas 繪制幸運(yùn)大轉(zhuǎn)盤功能

    微信小程序利用canvas 繪制幸運(yùn)大轉(zhuǎn)盤功能

    本文通過一段簡單的實例代碼給大家介紹微信小程序利用canvas 繪制幸運(yùn)大轉(zhuǎn)盤,代碼很簡單,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-07-07
  • js實現(xiàn)盒子移動動畫效果

    js實現(xiàn)盒子移動動畫效果

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)盒子移動動畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 淺談如何循序漸進(jìn)的學(xué)好JS

    淺談如何循序漸進(jìn)的學(xué)好JS

    如何才能學(xué)好JS?在這里給大家總結(jié)一些學(xué)習(xí)Js的經(jīng)驗,希望能對你們有所幫助。
    2021-05-05
  • 兩個JS之間的函數(shù)互相調(diào)用方式

    兩個JS之間的函數(shù)互相調(diào)用方式

    這篇文章主要介紹了兩個JS之間的函數(shù)互相調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • js實現(xiàn)表格單列按字母排序

    js實現(xiàn)表格單列按字母排序

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)表格單列按字母排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript使用function定義對象并調(diào)用的方法

    JavaScript使用function定義對象并調(diào)用的方法

    這篇文章主要介紹了JavaScript使用function定義對象并調(diào)用的方法,實例分析了javascript中function定義及使用對象與方法的相關(guān)技巧,需要的朋友可以參考下
    2015-03-03
  • ExtJS實現(xiàn)文件下載的方法實例

    ExtJS實現(xiàn)文件下載的方法實例

    這篇文章介紹了ExtJS實現(xiàn)文件下載的方法實例,有需要的朋友可以參考一下
    2013-11-11

最新評論

武冈市| 咸宁市| 虞城县| 彰武县| 沧州市| 楚雄市| 洛川县| 新绛县| 甘谷县| 金秀| 玉树县| 镶黄旗| 阿瓦提县| 安吉县| 南华县| 沂南县| 岳普湖县| 巫山县| 沽源县| 奉贤区| 洪泽县| 沁阳市| 兴国县| 连江县| 洛阳市| 荆州市| 和政县| 容城县| 尼木县| 迭部县| 宝丰县| 积石山| 万盛区| 兴安县| 彝良县| 姜堰市| 托克逊县| 黄平县| 康平县| 永安市| 大安市|