国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端ffmpeg壓縮視頻

這篇具有很好參考價值的文章主要介紹了前端ffmpeg壓縮視頻。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

下載ffmpeg

npm install @ffmpeg/core @ffmpeg/ffmpeg

這里需要注意兩個插件的版本? "@ffmpeg/core": "^0.10.0",? "@ffmpeg/ffmpeg": "^0.10.1"

配置ffmpeg

安裝好插件以后,需要配置一下代碼,否則會報錯:

1、以VUE為例 在vue.config.js文件中配置請求頭

devServer: {
	headers: {
		'Cross-Origin-Opener-Policy': 'same-origin',
		'Cross-Origin-Embedder-Policy': 'require-corp'
	}
}

2、在頁面中實例化ffmpeg的時候可能會報找不到模塊兒的錯誤

const ffmpeg = createFFmpeg({
      // ffmpeg路徑
      corePath: 'ffmpeg-core.js',
      // 日志
      log: true,
      // 進度
      progress: ({ ratio }) => {
           _this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
      }
})

因此,最好將下載好的插件文件放到public文件夾里面就可以了

vue 壓縮視頻ffmpeg,ffmpeg,音視頻,vue.js,前端

?使用ffmpeg壓縮視頻

  • 引入ffmpeg
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
  • ?文件上傳 獲取上傳的文件
<input id="upload" type="file" accept="video/mp4" capture="camcorder" @change="upload">

注:capture="camcorder" 代表獲取手機的攝像頭錄像? ?自行查看

  • 實例化ffmpeg
// 實例化ffmpeg
const ffmpeg = createFFmpeg({
      // ffmpeg路徑
      corePath: 'ffmpeg-core.js',
      // 日志
      log: true,
      // 進度
      progress: ({ ratio }) => {
          _this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
      }
})
  • 壓縮視頻
await ffmpeg.load()
this.msg = '開始壓縮'
// 把文件加到ffmpeg   寫文件
ffmpeg.FS('writeFile', name, await fetchFile(file))
// await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')
// 開始壓縮視頻
await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')
this.msg = '壓縮完成'
// 壓縮所完成,   讀文件  壓縮后的文件名稱為 put.mp4
const data = ffmpeg.FS('readFile', 'put.mp4')

?名詞解釋:-b: 比特率(也就是速度大?。?-crf: 壓縮的視頻質量?? -fs:? 把視頻壓縮到指定大?。ㄓ锌赡軙嚎s到指定大小,但是可能會剪切指定大小以后的視頻片段并刪除超出的部分)? -preset medium:? 壓縮速度? ? -s: 分辨率? (可以用于指定視頻的分辨率? 分辨率越大 壓縮時間越慢? ?越小 時間越快)? ? ?put.mp4:壓縮完成后的文件名稱

  • 壓縮完的視頻格式是blob格式按照需要可以將視頻格式轉換成file格式,代碼如下:
// 類型轉換 blob 轉換 file
transToFile (data) {
    console.log(data)
    const _this = this
    var file = []
    // 轉換bolb類型
    const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })
    // 這么寫是因為文件轉換是異步任務
    const transToFile = async (blob, fileName, fileType) => {
        return new window.File([blob], fileName, { type: fileType })
    }
    const textContain = transToFile(blob, 'put.mp4', 'video/mp4')
    // 轉換完成后可以將file對象傳給接口
    textContain.then((res) => {
        file.push(res)
        console.log('res', res)
    })
    return file
},
  • 如果你嫌壓縮的時間太長了,可以控制視頻的分辨率? ?代碼如下:
getVideoData () {
    return new Promise((resolve, reject) => {
        const videoElement = document.getElementById('video')
        videoElement.addEventListener('loadedmetadata', function () {
            resolve({
                width: this.videoWidth,
                height: this.videoHeight,
                duration: this.duration
            })
        })
    })
},

拿到視頻的寬高,壓縮的時候可以等比縮放一下

這里有個坑值得注意一下:如果頁面上沒有加載出來視頻的話,就不會觸發(fā)得到視頻寬高的,需要先把視頻加載出來才行? 代碼如下:

getObjectURL (file) {
    let url = null
    window.URL = window.URL || window.webkitURL
    if (window.URL) {
        url = window.URL.createObjectURL(file)
    } else {
        url = URL.createObjectURL(file)
    }
    return url
}

獻上所有代碼

<template>
    <div class="video-box">
      <video id="video" controls object-fill="fill"></video><br />
      <input id="upload" type="file" accept="video/mp4" capture="camcorder" @change="upload">
    </div>
</template>

<script>
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
export default {
    data () {
        return {
            msg: '',
            videoWidth: '',
            videoHeight: '',
            duration: ''
        }
    },
    methods: {
        // 選擇文件
        async upload (e) {
            console.log('start', e)
            console.log('start', e.target.files[0])
            var _this = this
            if (e.target.files[0]) {
                var filename = e.target.files[0].name
                var filetype = e.target.files[0].type

                const videoUrl = _this.getObjectURL(e.target.files[0])
                const video = document.getElementById('video')
                video.src = videoUrl

                this.getVideoData().then((videoObj) => {
                    const file = e.target.files[0]
                    console.log('videoObj:', videoObj)
                    const { width, height } = videoObj
                    const result = _this.squeezVideo(file, filename, filetype, width, height, _this.msg)
                    result.then(res => {
                        console.log('resultFile', res)
                    })
                })
            }
        },
        // 壓縮視頻
        async squeezVideo (file, filename, filetype, width, height) {
            console.log('squeezingVideo file name:  ', file.name)
            console.log('squeezingVideo file type:  ', file.type)
            console.log('squeezingVideo file path:  ', file.path)
            console.log('squeezingVideo file size:  ', file.size)
            console.log('squeezingVideo file lastModified:  ', file.lastModified)
            console.log('squeezingVideo file lastModifiedDate:  ', file.lastModifiedDate)
            const _this = this
            // 分辨率
            const resolution = `${width / 2}x${height / 2}`
            // 實例化ffmpeg
            const ffmpeg = createFFmpeg({
                // ffmpeg路徑
                corePath: 'ffmpeg-core.js',
                // 日志
                log: true,
                // 進度
                progress: ({ ratio }) => {
                    _this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
                }
            })
            var { name } = file
            this.msg = '正在加載 ffmpeg-core.js'
            // 開始加載
            await ffmpeg.load()
            this.msg = '開始壓縮'
            // 把文件加到ffmpeg   寫文件
            ffmpeg.FS('writeFile', name, await fetchFile(file))
            // await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')
            // 開始壓縮視頻
            await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')
            this.msg = '壓縮完成'
            // 壓縮所完成,   讀文件  壓縮后的文件名稱為 put.mp4
            const data = ffmpeg.FS('readFile', 'put.mp4')
            // 轉換壓縮后的視頻格式  當前為 blob 格式
            var filed = _this.transToFile(data)
            console.log('transToFile: ', filed)
            return new Promise((resolve, reject) => {
                if (filed) {
                    resolve({
                        squzingFile: filed
                    })
                }
            })
        },
        // 獲取視頻的寬高分辨率
        getVideoData () {
            return new Promise((resolve, reject) => {
                const videoElement = document.getElementById('video')
                videoElement.addEventListener('loadedmetadata', function () {
                    resolve({
                        width: this.videoWidth,
                        height: this.videoHeight,
                        duration: this.duration
                    })
                })
            })
        },
        // 獲取上傳視頻的url
        getObjectURL (file) {
            let url = null
            window.URL = window.URL || window.webkitURL
            if (window.URL) {
                url = window.URL.createObjectURL(file)
            } else {
                url = URL.createObjectURL(file)
            }
            return url
        },
        // 類型轉換 blob 轉換 file
        transToFile (data) {
            console.log(data)
            const _this = this
            var file = []
            // 轉換bolb類型
            const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })
            // 這么寫是因為文件轉換是異步任務
            const transToFile = async (blob, fileName, fileType) => {
                return new window.File([blob], fileName, { type: fileType })
            }
            const textContain = transToFile(blob, 'put.mp4', 'video/mp4')
            // 轉換完成后可以將file對象傳給接口
            textContain.then((res) => {
                file.push(res)
                console.log('res', res)
                // _this.confirm(file)
            })
            return file
        }
    }
}
</script>

?可以封裝壓縮視頻代碼

  • 目錄src/utils/ffmpeg.js
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'

// 壓縮視頻
const squeezVideo = async (file, filename, filetype, width, height) => {
    console.log('file', file)
    console.log('filename', filename)
    console.log('filetype', filetype)
    console.log('width', width)
    console.log('height', height)
    // 分辨率
    const resolution = `${width / 2}x${height / 2}`
    // 實例化ffmpeg
    const ffmpeg = createFFmpeg({
        // ffmpeg路徑
        corePath: 'ffmpeg-core.js',
        // 日志
        log: true
        // 進度
        // progress: ({ ratio }) => {
        //     msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`
        // }
    })
    console.log('file---', file)
    var { name } = file
    // msg = '正在加載 ffmpeg-core.js'
    // 開始加載
    await ffmpeg.load()
    // msg = '開始壓縮'
    // 把文件加到ffmpeg   寫文件
    ffmpeg.FS('writeFile', name, await fetchFile(file))
    // await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')
    // 開始壓縮視頻
    await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')
    // msg = '壓縮完成'
    // 壓縮所完成,   讀文件  壓縮后的文件名稱為 put.mp4
    const data = ffmpeg.FS('readFile', 'put.mp4')
    // 轉換壓縮后的視頻格式  當前為 blob 格式
    var res = transToFile(data, filename, filetype)
    return new Promise((result, reject) => {
        result({
            filed: res
        })
    })
}

// 類型轉換 blob 轉換 file
const transToFile = (data, filename, filetype) => {
    var filed = []
    console.log(data)
    // 轉換bolb類型
    const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })
    // 這么寫是因為文件轉換是異步任務
    const transToFile = async (blob, fileName, fileType) => {
        return new window.File([blob], fileName, { type: fileType })
    }
    const textContain = transToFile(blob, filename, filetype)
    // 轉換完成后可以將file對象傳給接口
    textContain.then((res) => {
        filed.push(res)
        console.log('res', res)
    })
    return filed
}
export { squeezVideo }

注意事項:

ffmpeg是一款很強大的視頻編輯工具,你可以自己研究研究,上述的代碼可以自己封裝一下,另外ffmpeg不能用于微信環(huán)境或者是企微環(huán)境,代碼執(zhí)行不下去。

效果視頻

ffmpeg壓縮視頻

如果各位視頻看不到的話,請移步到我的主頁進行觀看

vue 壓縮視頻ffmpeg,ffmpeg,音視頻,vue.js,前端

?還有一種插件好像可以? video-conversion.js? 但是沒有找到官網,有小伙伴研究成功的話,踢我一下哈

文章若有不足之處? 煩請指正文章來源地址http://www.zghlxwxcb.cn/news/detail-760650.html

到了這里,關于前端ffmpeg壓縮視頻的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 音視頻 ffmpeg視頻裁剪

    將輸入視頻幀的寬度和高度從x和y值表示的位置裁剪到指定的寬度和高度;x和y是輸出的左上角坐標,協調系統的中心是輸入視頻幀的左上角。 如果使用了可選的keep_aspect參數,將會改變輸出SAR(樣本寬比)以補償新的DAR(顯示長寬比) 推薦一個零聲學院項目課,個人覺得老師講得不

    2024年02月10日
    瀏覽(24)
  • 音視頻 ffmpeg命令視頻錄制(Windows)

    先安裝dshow軟件 Screen Capturer Recorder, 項目地址:https://sourceforge.net/projects/screencapturer/files/ 然后查看可用設備名字:ffmpeg -list_devices true -f dshow -i dummy 錄制視頻(默認參數) 錄制聲音(默認參數) 同時錄制聲音和視頻(默認參數) 查看視頻錄制的可選參數 查看視頻錄制的可

    2024年02月10日
    瀏覽(27)
  • [一]ffmpeg音視頻解碼

    [一]ffmpeg音視頻解碼

    (1)下載FFmpeg源碼(v3.3.6) 下載地址( http://www.ffmpeg.org/download.html#releases ) (2)下載NDK(r14b) 下載地址( https://developer.android.google.cn/ndk/downloads/index.html) (3)編寫Android編譯腳本 (1)用ftp上傳到Ubuntu中 (2)解壓Ffmpeg(tar -zxvf ffmpeg-3.3.6.tar.gz) (3)解壓NDK(unzip andro

    2024年01月19日
    瀏覽(1558)
  • ffmpeg解決bilibili下載的音視頻分離問題,將音視頻一鍵合成

    ffmpeg解決bilibili下載的音視頻分離問題,將音視頻一鍵合成

    1:到FFmpeg下載安裝包,我安裝的是windows 下載打包文件 2:解壓文件到本地 以下為解壓后的文件視圖 3:點擊進去第一個bin文件,復制該目錄,安裝到本地環(huán)境變量中 然后點擊確定進行保存設置 4:ctrl+r打開運行,輸入cmd打開命令窗口,輸入ffmpeg -version查看版本 安裝成功 將所

    2024年02月11日
    瀏覽(28)
  • ffmpeg系列學習——FFmpeg的音視頻處理

    1.音視頻的采樣率、采樣位深度和聲道數 音頻和視頻的采樣率、采樣位深度和聲道數是媒體文件中的重要參數,它們會直接影響到音視頻的質量和文件大小。下面對它們進行詳細解釋: 采樣率 采樣率指音頻每秒鐘采樣的次數,用赫茲(Hz)表示。采樣率越高,音頻的還原度越

    2024年02月04日
    瀏覽(84)
  • Vue 2.0 前端使用 ffmpeg 壓縮視頻

    Vue 2.0 前端使用 ffmpeg 壓縮視頻

    1. (我之前因為直接裝了導致報錯) ?要安裝這個版本 npm install @ffmpeg/ffmpeg@0.10.1 -S npm install @ffmpeg/core@0.10.0 -S 2.找到vue.config.js devServer:?{ ??? ?headers:?{ ??????\\\"Cross-Origin-Opener-Policy\\\":?\\\"same-origin\\\", ??????\\\"Cross-Origin-Embedder-Policy\\\":?\\\"require-corp\\\", ????}, } 加上紅色這段代碼 3

    2024年02月09日
    瀏覽(19)
  • 音視頻 ffmpeg命令圖片與視頻互轉

    截取一張圖片 轉換視頻為圖片(每幀一張圖): 圖片轉換為視頻: 從視頻中生成GIF圖片 將 GIF 轉化為 視頻 推薦一個零聲學院項目課,個人覺得老師講得不錯,分享給大家: 零聲白金學習卡(含基礎架構/高性能存儲/golang云原生/音視頻/Linux內核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    瀏覽(20)
  • 音視頻項目—基于FFmpeg和SDL的音視頻播放器解析(三)

    介紹 在本系列,我打算花大篇幅講解我的 gitee 項目音視頻播放器,在這個項目,您可以學到音視頻解封裝,解碼,SDL渲染相關的知識。您對源代碼感興趣的話,請查看基于FFmpeg和SDL的音視頻播放器 如果您不理解本文,可參考我的前一篇文章音視頻項目—基于FFmpeg和SDL的音視

    2024年02月05日
    瀏覽(106)
  • 音視頻 FFmpeg命令行搭建

    音視頻 FFmpeg命令行搭建

    以FFmpeg4.2.1 win32為例 解壓ffmpeg-4.2.1-win32-shared.zip 拷?可執(zhí)??件到C:Windows 拷?動態(tài)鏈接庫到C:WindowsSysWOW64 注:WoW64 (Windows On Windows64)是?個Windows操作系統的?系統,被設計?來處理許多在32-bit Windows和64-bit Windows之間的不同的問題,使得可以在64-bit Windows中運?32-bit程序 推薦

    2024年02月13日
    瀏覽(23)
  • FFMPEG常用命令 音視頻合并

    FFMPEG常用命令 音視頻合并

    ? ? ? ? 目錄 一、音頻合并 1.獲取音頻時長 2.合并兩段音頻 3.合并音頻插入空白 二、視頻加背景圖 三、音視頻合成 1.保留視頻聲音 2.不保留視頻聲音 四、合并視頻 ????????本文將用幾個實例,介紹ffmpeg命令的綜合使用,主要涉及音頻處理、視頻處理和音視頻合成。 參數

    2024年02月10日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包