sh# 安装库
npm install @ffmpeg/ffmpeg @ffmpeg/util @ffmpeg/core
sh# 压缩wasm
gzip -k ffmpeg-core.js
gzip -k ffmpeg-core.wasm
shdocker 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 许可协议。转载请注明出处!