2026-04-30
音视频
00
sh
# 安装库 npm install @ffmpeg/ffmpeg @ffmpeg/util @ffmpeg/core
sh
# 压缩wasm gzip -k ffmpeg-core.js gzip -k ffmpeg-core.wasm
sh
docker build \ --build-arg http_proxy=http://192.168.66.18:10809 \ --build-arg https_proxy=http://192.168.66.18:10809 \ -t ffmpegwasm . # docker build -t ffmpegwasm . # docker create --name extract ffmpeg-wasm-lite docker run -it --name extract ffmpegwasm:latest bash docker cp extract:/dist ./lib docker rm extract cp -r ./lib/dist /home/ice/yizhi/yzwertc/tools/ffmpeg/js/core
dockerfile
# syntax=docker/dockerfile-upstream:master-labs # Base emsdk image with environment variables. FROM emscripten/emsdk:3.1.40 AS emsdk-base ARG EXTRA_CFLAGS ARG EXTRA_LDFLAGS ARG FFMPEG_ST ARG FFMPEG_MT ENV INSTALL_DIR=/opt # We cannot upgrade to n6.0 as ffmpeg bin only supports multithread at the moment. ENV FFMPEG_VERSION=n5.1.4 ENV CFLAGS="-I$INSTALL_DIR/include $CFLAGS $EXTRA_CFLAGS" ENV CXXFLAGS="$CFLAGS" ENV LDFLAGS="-L$INSTALL_DIR/lib $LDFLAGS $CFLAGS $EXTRA_LDFLAGS" ENV EM_PKG_CONFIG_PATH=$EM_PKG_CONFIG_PATH:$INSTALL_DIR/lib/pkgconfig:/emsdk/upstream/emscripten/system/lib/pkgconfig ENV EM_TOOLCHAIN_FILE=$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake ENV PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$EM_PKG_CONFIG_PATH ENV FFMPEG_ST=$FFMPEG_ST ENV FFMPEG_MT=$FFMPEG_MT RUN apt-get update && \ apt-get install -y pkg-config autoconf automake libtool ragel git # Build x264 FROM emsdk-base AS x264-builder ENV X264_BRANCH=4-cores # ADD https://github.com/ffmpegwasm/x264.git#$X264_BRANCH /src RUN git clone --branch ${X264_BRANCH} --depth 1 https://github.com/ffmpegwasm/x264.git /src COPY build/x264.sh /src/build.sh RUN bash -x /src/build.sh # Build x265 FROM emsdk-base AS x265-builder ENV X265_BRANCH=3.4 # ADD https://github.com/ffmpegwasm/x265.git#$X265_BRANCH /src RUN git clone --branch ${X265_BRANCH} --depth 1 https://github.com/ffmpegwasm/x265.git /src COPY build/x265.sh /src/build.sh RUN bash -x /src/build.sh # Build libvpx FROM emsdk-base AS libvpx-builder ENV LIBVPX_BRANCH=v1.13.1 # ADD https://github.com/ffmpegwasm/libvpx.git#$LIBVPX_BRANCH /src RUN git clone --branch ${LIBVPX_BRANCH} --depth 1 https://github.com/ffmpegwasm/libvpx.git /src COPY build/libvpx.sh /src/build.sh RUN bash -x /src/build.sh # Build lame FROM emsdk-base AS lame-builder ENV LAME_BRANCH=master # ADD https://github.com/ffmpegwasm/lame.git#$LAME_BRANCH /src RUN git clone --branch ${LAME_BRANCH} --depth 1 https://github.com/ffmpegwasm/lame.git /src COPY build/lame.sh /src/build.sh RUN bash -x /src/build.sh # Build ogg FROM emsdk-base AS ogg-builder ENV OGG_BRANCH=v1.3.4 # ADD https://github.com/ffmpegwasm/Ogg.git#$OGG_BRANCH /src RUN git clone --branch ${OGG_BRANCH} --depth 1 https://github.com/ffmpegwasm/Ogg.git /src COPY build/ogg.sh /src/build.sh RUN bash -x /src/build.sh # Build theora FROM emsdk-base AS theora-builder COPY --from=ogg-builder $INSTALL_DIR $INSTALL_DIR ENV THEORA_BRANCH=v1.1.1 # ADD https://github.com/ffmpegwasm/theora.git#$THEORA_BRANCH /src RUN git clone --branch ${THEORA_BRANCH} --depth 1 https://github.com/ffmpegwasm/theora.git /src COPY build/theora.sh /src/build.sh RUN bash -x /src/build.sh # Build opus FROM emsdk-base AS opus-builder ENV OPUS_BRANCH=v1.3.1 # ADD https://github.com/ffmpegwasm/opus.git#$OPUS_BRANCH /src RUN git clone --branch ${OPUS_BRANCH} --depth 1 https://github.com/ffmpegwasm/opus.git /src COPY build/opus.sh /src/build.sh RUN bash -x /src/build.sh # Build vorbis FROM emsdk-base AS vorbis-builder COPY --from=ogg-builder $INSTALL_DIR $INSTALL_DIR ENV VORBIS_BRANCH=v1.3.3 # ADD https://github.com/ffmpegwasm/vorbis.git#$VORBIS_BRANCH /src RUN git clone --branch ${VORBIS_BRANCH} --depth 1 https://github.com/ffmpegwasm/vorbis.git /src COPY build/vorbis.sh /src/build.sh RUN bash -x /src/build.sh # Build zlib FROM emsdk-base AS zlib-builder ENV ZLIB_BRANCH=v1.2.11 # ADD https://github.com/ffmpegwasm/zlib.git#$ZLIB_BRANCH /src RUN git clone --branch ${ZLIB_BRANCH} --depth 1 https://github.com/ffmpegwasm/zlib.git /src COPY build/zlib.sh /src/build.sh RUN bash -x /src/build.sh # Build libwebp FROM emsdk-base AS libwebp-builder COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR ENV LIBWEBP_BRANCH=v1.3.2 # ADD https://github.com/ffmpegwasm/libwebp.git#$LIBWEBP_BRANCH /src RUN git clone --branch ${LIBWEBP_BRANCH} --depth 1 https://github.com/ffmpegwasm/libwebp.git /src COPY build/libwebp.sh /src/build.sh RUN bash -x /src/build.sh # Build freetype2 FROM emsdk-base AS freetype2-builder ENV FREETYPE2_BRANCH=VER-2-10-4 # ADD https://github.com/ffmpegwasm/freetype2.git#$FREETYPE2_BRANCH /src RUN git clone --branch ${FREETYPE2_BRANCH} --depth 1 https://github.com/ffmpegwasm/freetype2.git /src COPY build/freetype2.sh /src/build.sh RUN bash -x /src/build.sh # Build fribidi FROM emsdk-base AS fribidi-builder ENV FRIBIDI_BRANCH=v1.0.9 # ADD https://github.com/fribidi/fribidi.git#$FRIBIDI_BRANCH /src RUN git clone --branch ${FRIBIDI_BRANCH} --depth 1 https://github.com/fribidi/fribidi.git /src COPY build/fribidi.sh /src/build.sh RUN bash -x /src/build.sh # Build harfbuzz FROM emsdk-base AS harfbuzz-builder ENV HARFBUZZ_BRANCH=5.2.0 # ADD https://github.com/harfbuzz/harfbuzz.git#$HARFBUZZ_BRANCH /src RUN git clone --branch ${HARFBUZZ_BRANCH} --depth 1 https://github.com/harfbuzz/harfbuzz.git /src COPY build/harfbuzz.sh /src/build.sh RUN bash -x /src/build.sh # Build libass FROM emsdk-base AS libass-builder COPY --from=freetype2-builder $INSTALL_DIR $INSTALL_DIR COPY --from=fribidi-builder $INSTALL_DIR $INSTALL_DIR COPY --from=harfbuzz-builder $INSTALL_DIR $INSTALL_DIR ENV LIBASS_BRANCH=0.15.0 # ADD https://github.com/libass/libass.git#$LIBASS_BRANCH /src RUN git clone --branch ${LIBASS_BRANCH} --depth 1 https://github.com/libass/libass.git /src COPY build/libass.sh /src/build.sh RUN bash -x /src/build.sh # Build zimg FROM emsdk-base AS zimg-builder ENV ZIMG_BRANCH=release-3.0.5 RUN apt-get update && apt-get install -y git RUN git clone --recursive -b $ZIMG_BRANCH https://github.com/sekrit-twc/zimg.git /src COPY build/zimg.sh /src/build.sh RUN bash -x /src/build.sh # Base ffmpeg image with dependencies and source code populated. FROM emsdk-base AS ffmpeg-base RUN embuilder build sdl2 sdl2-mt RUN git clone --branch ${FFMPEG_VERSION} --depth 1 https://github.com/FFmpeg/FFmpeg.git /src # ADD https://github.com/FFmpeg/FFmpeg.git#$FFMPEG_VERSION /src # COPY --from=x264-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=x265-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libvpx-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=lame-builder $INSTALL_DIR $INSTALL_DIR COPY --from=opus-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=theora-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=vorbis-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libwebp-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libass-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=zimg-builder $INSTALL_DIR $INSTALL_DIR COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR # Build ffmpeg FROM ffmpeg-base AS ffmpeg-builder COPY build/ffmpeg.sh /src/build.sh RUN bash -x /src/build.sh \ --disable-everything \ --enable-demuxer=mov \ --enable-demuxer=matroska \ --enable-demuxer=ogg \ --enable-muxer=hls \ --enable-muxer=segment \ --enable-muxer=mpegts \ --enable-muxer=adts \ --enable-protocol=file \ --enable-decoder=opus \ --enable-encoder=aac \ --enable-encoder=copy \ --enable-parser=h264 \ --enable-parser=opus \ --enable-parser=aac \ --enable-filter=abuffer \ --enable-filter=aformat \ --enable-filter=aresample \ --enable-filter=anull \ --enable-small \ --enable-zlib # # --enable-gpl \ # # --enable-libx264 \ # # --enable-libx265 \ # # --enable-libvpx \ # --enable-demuxer=matroska \ # --enable-demuxer=ogg \ # #-------------------------- # --enable-muxer=hls \ # --enable-muxer=segment \ # --enable-muxer=mpegts \ # --enable-muxer=adts \ # #-------------------------- # --enable-protocol=file \ # #-------------------------- # # --enable-decoder=vp8 \ # # --enable-decoder=vp9 \ # # --enable-decoder=aac \ # --enable-decoder=opus \ # # --enable-decoder=h264 \ # #-------------------------- # --enable-parser=aac \ # --enable-parser=h264 \ # --enable-parser=opus \ # #-------------------------- # --enable-encoder=copy \ # --enable-encoder=aac \ # # --enable-encoder=h264 \ # #-------------------------- # # --enable-filter=anull \ # # --enable-filter=aresample \ # # --enable-filter=scale \ # # --enable-filter=null \ # --enable-filter=format \ # --enable-filter=copy \ # --enable-filter=abuffer \ # --enable-filter=aformat \ # #-------------------------- # # --enable-libmp3lame \ # # --enable-libtheora \ # # --enable-libvorbis \ # --enable-libopus \ # --enable-zlib \ # # --enable-libwebp \ # # --enable-libfreetype \ # # --enable-libfribidi \ # # --enable-libass \ # # --enable-libzimg # #--------------------------- # --enable-small \ # --disable-network \ # --disable-autodetect \ # --disable-swresample \ # --disable-swscale # Build ffmpeg.wasm FROM ffmpeg-builder AS ffmpeg-wasm-builder COPY src/bind /src/src/bind COPY src/fftools /src/src/fftools COPY build/ffmpeg-wasm.sh build.sh # libraries to link ENV FFMPEG_LIBS \ # -lx264 \ # -lx265 \ # -lvpx \ # -lmp3lame \ # -logg \ # -ltheora \ # -lvorbis \ # -lvorbisenc \ # -lvorbisfile \ -lopus \ -lz # -lwebpmux \ # -lwebp \ # -lsharpyuv # -lfreetype \ # -lfribidi \ # -lharfbuzz \ # -lass \ # -lzimg RUN mkdir -p /src/dist/umd && bash -x /src/build.sh \ ${FFMPEG_LIBS} \ -o dist/umd/ffmpeg-core.js RUN mkdir -p /src/dist/esm && bash -x /src/build.sh \ ${FFMPEG_LIBS} \ -sEXPORT_ES6 \ -o dist/esm/ffmpeg-core.js # Export ffmpeg-core.wasm to dist/, use `docker buildx build -o . .` to get assets FROM scratch AS exportor COPY --from=ffmpeg-wasm-builder /src/dist /dist
sh
# ffmpeg-wasm编译 #!/bin/bash # `-o <OUTPUT_FILE_NAME>` must be provided when using this build script. # ex: # bash ffmpeg-wasm.sh -o ffmpeg.js set -euo pipefail EXPORT_NAME="createFFmpegCore" CONF_FLAGS=( -I. -I./src/fftools -I$INSTALL_DIR/include -L$INSTALL_DIR/lib -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavutil # -Llibpostproc -Llibswresample -Llibswscale -lavcodec -lavdevice -lavfilter -lavformat -lavutil # -lpostproc -lswresample -lswscale -sTOTAL_MEMORY=256MB -Wno-deprecated-declarations $LDFLAGS -sENVIRONMENT=worker -sWASM_BIGINT # enable big int support -sUSE_SDL=2 # use emscripten SDL2 lib port -sSTACK_SIZE=5MB # increase stack size to support libopus -sMODULARIZE # modularized to use as a library ${FFMPEG_MT:+ -sINITIAL_MEMORY=1024MB} # ALLOW_MEMORY_GROWTH is not recommended when using threads, thus we use a large initial memory ${FFMPEG_MT:+ -sPTHREAD_POOL_SIZE=32} # use 32 threads ${FFMPEG_ST:+ -sINITIAL_MEMORY=32MB -sALLOW_MEMORY_GROWTH} # Use just enough memory as memory usage can grow -sEXPORT_NAME="$EXPORT_NAME" # required in browser env, so that user can access this module from window object -sEXPORTED_FUNCTIONS=$(node src/bind/ffmpeg/export.js) # exported functions -sEXPORTED_RUNTIME_METHODS=$(node src/bind/ffmpeg/export-runtime.js) # exported built-in functions -lworkerfs.js --pre-js src/bind/ffmpeg/bind.js # extra bindings, contains most of the ffmpeg.wasm javascript code # ffmpeg source code src/fftools/cmdutils.c src/fftools/ffmpeg.c src/fftools/ffmpeg_filter.c src/fftools/ffmpeg_hw.c src/fftools/ffmpeg_mux.c src/fftools/ffmpeg_opt.c src/fftools/opt_common.c src/fftools/ffprobe.c ) emcc "${CONF_FLAGS[@]}" $@
json
# nginx配置 location ~* \.wasm\.gz$ { add_header Content-Encoding gzip; add_header Vary Accept-Encoding; add_header Content-Type application/wasm; }
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>MP4 → HLS 并打包下载 (FFmpeg.wasm)</title> <style> body { font-family: sans-serif; padding: 20px; } video { display: block; margin-top: 1em; max-width: 640px; } </style> </head> <body> <h2>上传 MP4 → 转码为 HLS → 下载 ZIP</h2> <input type="file" id="uploader" accept="video/mp4"> <button id="loadBtn">加载 FFmpeg Core</button> <button id="transBtn" disabled>开始转码 + 下载</button> <p id="log">请先上传视频并加载 FFmpeg</p> <!-- video player --> <video id="video" controls></video> <!-- hls.js for playback --> <script src="https://cdn.jsdelivr.net/npm/hls.js@1"></script> <!-- jszip for ZIP --> <script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script> <!-- ffmpeg.wasm core --> <script type="module"> import { FFmpeg } from './js/ffmpeg/dist/esm/index.js'; import { fetchFile, toBlobURL } from './js/util/dist/esm/index.js'; const ffmpeg = new FFmpeg(); const log = document.getElementById('log'); const video = document.getElementById('video'); const loadBtn = document.getElementById('loadBtn'); const transBtn = document.getElementById('transBtn'); const uploader = document.getElementById('uploader'); let uploadedFile; uploader.onchange = (e) => { uploadedFile = e.target.files[0]; if (uploadedFile) { log.textContent = `已选择:${uploadedFile.name}`; } }; ffmpeg.on('log', ({ message }) => { log.textContent = message; console.log(message); }); loadBtn.onclick = async () => { loadBtn.disabled = true; log.textContent = '加载 FFmpeg 核心中...'; const base = './js/core/dist/esm'; const coreURL = await toBlobURL(`${base}/ffmpeg-core.js`, 'text/javascript'); const wasmURL = await toBlobURL(`${base}/ffmpeg-core.wasm`, 'application/wasm'); await ffmpeg.load({ coreURL, wasmURL }); log.textContent = 'FFmpeg 加载完成'; transBtn.disabled = false; }; transBtn.onclick = async () => { if (!uploadedFile) { log.textContent = '请先选择 MP4 文件'; return; } transBtn.disabled = true; log.textContent = '读取文件中...'; const inputData = await fetchFile(uploadedFile); await ffmpeg.writeFile('input.mp4', inputData); log.textContent = '转码为 HLS 中...'; await ffmpeg.exec([ '-i', 'input.mp4', '-codec:', 'copy', '-start_number', '0', '-f', 'hls', '-hls_time', '10', '-hls_list_size', '0', 'output.m3u8' ]); // 获取 m3u8 和 ts 文件名 const m3u8Data = await ffmpeg.readFile('output.m3u8'); const m3u8Text = new TextDecoder().decode(m3u8Data.buffer); const tsFiles = [...m3u8Text.matchAll(/([^\r\n]+\.ts)/g)].map(m => m[1]); console.log(tsFiles); // 看看数组里有啥 // 打包 ZIP // const zip = new JSZip(); // zip.file('output.m3u8', m3u8Data); // for (const tsFile of tsFiles) { // try { // const tsData = await ffmpeg.readFile(tsFile); // zip.file(tsFile, tsData); // } catch (e) { // console.error('读取 ts 文件失败:', tsFile, e); // } // } // log.textContent = '打包压缩中...'; // const zipBlob = await zip.generateAsync({ type: 'blob' }); // // 触发下载 // const a = document.createElement('a'); // a.href = URL.createObjectURL(zipBlob); // a.download = 'hls_output.zip'; // a.click(); // log.textContent = '打包完成,已下载 ZIP'; // 可选:本地播放(可跳过) const m3u8URL = URL.createObjectURL(new Blob([m3u8Data.buffer], { type: 'application/vnd.apple.mpegurl' })); const tsMap = new Map(); for (const tsFile of tsFiles) { const tsData = await ffmpeg.readFile(tsFile); const tsURL = URL.createObjectURL(new Blob([tsData.buffer], { type: 'video/MP2T' })); tsMap.set(tsFile, tsURL); } let modifiedM3U8 = m3u8Text; for (const [tsFile, tsURL] of tsMap.entries()) { modifiedM3U8 = modifiedM3U8.replace(tsFile, tsURL); } const finalBlob = new Blob([modifiedM3U8], { type: 'application/vnd.apple.mpegurl' }); const finalURL = URL.createObjectURL(finalBlob); if (Hls.isSupported()) { const hls = new Hls(); hls.loadSource(finalURL); hls.attachMedia(video); } else { video.src = finalURL; } }; </script> </body> </html>
FROM emsdk-base AS ffmpeg-base RUN embuilder build sdl2 sdl2-mt # ADD https://github.com/FFmpeg/FFmpeg.git#$FFMPEG_VERSION /src RUN git clone --branch ${FFMPEG_VERSION} --depth 1 https://github.com/FFmpeg/FFmpeg.git /src # COPY --from=x264-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=x265-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libvpx-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=lame-builder $INSTALL_DIR $INSTALL_DIR COPY --from=opus-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=theora-builder $INSTALL_DIR $INSTALL_DIR COPY --from=vorbis-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libwebp-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libass-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=zimg-builder $INSTALL_DIR $INSTALL_DIR COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR # Build ffmpeg FROM ffmpeg-base AS ffmpeg-builder COPY build/ffmpeg.sh /src/build.sh RUN bash -x /src/build.sh \ --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --enable-libvpx \ --enable-libmp3lame \ --enable-libtheora \ --enable-libvorbis \ --enable-libopus \ --enable-zlib \ --enable-libwebp \ --enable-libfreetype \ --enable-libfribidi \ --enable-libass \ --enable-libzimg # Build ffmpeg.wasm FROM ffmpeg-builder AS ffmpeg-wasm-builder COPY src/bind /src/src/bind COPY src/fftools /src/src/fftools COPY build/ffmpeg-wasm.sh build.sh # libraries to link ENV FFMPEG_LIBS \ -lx264 \ -lx265 \ -lvpx \ -lmp3lame \ -logg \ -ltheora \ -lvorbis \ -lvorbisenc \ -lvorbisfile \ -lopus \ -lz \ -lwebpmux \ -lwebp \ -lsharpyuv \ -lfreetype \ -lfribidi \ -lharfbuzz \ -lass \ -lzimg RUN mkdir -p /src/dist/umd && bash -x /src/build.sh \ ${FFMPEG_LIBS} \ -o dist/umd/ffmpeg-core.js RUN mkdir -p /src/dist/esm && bash -x /src/build.sh \ ${FFMPEG_LIBS} \ -sEXPORT_ES6 \ -o dist/esm/ffmpeg-core.js # Export ffmpeg-core.wasm to dist/, use `docker buildx build -o . .` to get assets FROM scratch AS exportor COPY --from=ffmpeg-wasm-builder /src/dist /dist
FROM ffmpeg-base AS ffmpeg-builder COPY build/ffmpeg.sh /src/build.sh RUN bash -x /src/build.sh \ --disable-everything \ --enable-gpl \ --enable-demuxer=matroska \ --enable-muxer=hls \ --enable-muxer=segment \ --enable-protocol=file \ --enable-decoder=vp8 \ --enable-decoder=vp9 \ --enable-decoder=aac \ --enable-decoder=opus \ --enable-decoder=h264 \ --enable-parser=aac \ --enable-parser=h264 \ --enable-parser=opus \ --enable-encoder=copy \ --enable-encoder=aac \ --enable-libvorbis \ --enable-zlib \ --enable-libopus \ --enable-filter=anull \ --enable-small \ --disable-network \ --disable-autodetect # --enable-gpl \ # --enable-libx264 \ # --enable-libx265 \ # --enable-libvpx \ # --enable-libmp3lame \ # --enable-libtheora \ # --enable-libvorbis \ # --enable-libopus \ # --enable-zlib \ # --enable-libwebp \ # --enable-libfreetype \ # --enable-libfribidi \ # --enable-libass \ # --enable-libzimg # Build ffmpeg.wasm FROM ffmpeg-builder AS ffmpeg-wasm-builder COPY src/bind /src/src/bind COPY src/fftools /src/src/fftools COPY build/ffmpeg-wasm.sh build.sh # libraries to link ENV FFMPEG_LIBS \ -lz \ # -lx264 \ # -lx265 \ # -lvpx \ # -lmp3lame \ -logg \ # -ltheora \ # -lvorbis \ # -lvorbisenc \ # -lvorbisfile \ -lopus # -lwebpmux \ # -lwebp \ # -lsharpyuv \ # -lfreetype \ # -lfribidi \ # -lharfbuzz \ # -lass \ # -lzimg

0717

# Base ffmpeg image with dependencies and source code populated. FROM emsdk-base AS ffmpeg-base RUN embuilder build sdl2 sdl2-mt RUN git clone --branch ${FFMPEG_VERSION} --depth 1 https://github.com/FFmpeg/FFmpeg.git /src # ADD https://github.com/FFmpeg/FFmpeg.git#$FFMPEG_VERSION /src COPY --from=x264-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=x265-builder $INSTALL_DIR $INSTALL_DIR # COPY --from=libvpx-builder $INSTALL_DIR $INSTALL_DIR COPY --from=lame-builder $INSTALL_DIR $INSTALL_DIR COPY --from=opus-builder $INSTALL_DIR $INSTALL_DIR COPY --from=theora-builder $INSTALL_DIR $INSTALL_DIR COPY --from=vorbis-builder $INSTALL_DIR $INSTALL_DIR COPY --from=libwebp-builder $INSTALL_DIR $INSTALL_DIR COPY --from=libass-builder $INSTALL_DIR $INSTALL_DIR COPY --from=zimg-builder $INSTALL_DIR $INSTALL_DIR # Build ffmpeg FROM ffmpeg-base AS ffmpeg-builder COPY build/ffmpeg.sh /src/build.sh RUN bash -x /src/build.sh \ --disable-everything \ --enable-gpl \ --enable-libx264 \ # --enable-libx265 \ # --enable-libvpx \ --enable-demuxer=matroska \ --enable-demuxer=ogg \ #-------------------------- --enable-muxer=hls \ --enable-muxer=segment \ --enable-muxer=mpegts \ --enable-muxer=adts \ #-------------------------- --enable-protocol=file \ #-------------------------- --enable-decoder=vp8 \ --enable-decoder=vp9 \ --enable-decoder=aac \ --enable-decoder=opus \ --enable-decoder=h264 \ #-------------------------- --enable-parser=aac \ --enable-parser=h264 \ --enable-parser=opus \ #-------------------------- --enable-encoder=copy \ --enable-encoder=aac \ --enable-encoder=h264 \ #-------------------------- --enable-filter=anull \ --enable-filter=aresample \ --enable-filter=scale \ --enable-filter=null \ --enable-filter=format \ --enable-filter=copy \ --enable-filter=abuffer \ --enable-filter=aformat \ #-------------------------- # --enable-sample-fmts=fltp,s16 \ #-------------------------- --enable-libmp3lame \ --enable-libtheora \ --enable-libvorbis \ --enable-libopus \ --enable-zlib \ --enable-libwebp \ --enable-libfreetype \ --enable-libfribidi \ --enable-libass \ --enable-libzimg # Build ffmpeg.wasm FROM ffmpeg-builder AS ffmpeg-wasm-builder COPY src/bind /src/src/bind COPY src/fftools /src/src/fftools COPY build/ffmpeg-wasm.sh build.sh # libraries to link ENV FFMPEG_LIBS \ -lx264 \ # -lx265 \ # -lvpx \ -lmp3lame \ -logg \ -ltheora \ -lvorbis \ -lvorbisenc \ -lvorbisfile \ -lopus \ -lz \ -lwebpmux \ -lwebp \ -lsharpyuv \ -lfreetype \ -lfribidi \ -lharfbuzz \ -lass \ -lzimg

本文作者:zion

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!