forked from forks/ffprobe-wasm
Compare commits
11 Commits
1615115ea8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
62ae9d08f0
|
|||
|
54b90ac7f5
|
|||
|
6a18dba891
|
|||
|
0720911da0
|
|||
|
367f74f146
|
|||
|
886300d690
|
|||
|
c036e98101
|
|||
|
465d4ec3ed
|
|||
|
087e488ae9
|
|||
|
73cb05f572
|
|||
|
3b2c5877ad
|
110
Dockerfile
110
Dockerfile
@@ -1,51 +1,20 @@
|
|||||||
FROM emscripten/emsdk:5.0.1 AS build
|
FROM emscripten/emsdk:5.0.1 AS build
|
||||||
|
|
||||||
|
ARG BUILD_USER=1000
|
||||||
ARG FFMPEG_VERSION=8.0.1
|
ARG FFMPEG_VERSION=8.0.1
|
||||||
ARG X264_COMMIT=b35605a
|
|
||||||
ARG LAME_VERSION=3.100
|
|
||||||
|
|
||||||
ARG PREFIX=/opt/ffmpeg
|
ARG PREFIX=/tmp/ffmpeg-build
|
||||||
ARG MAKEFLAGS="-j4"
|
ARG MAKEFLAGS="-j4"
|
||||||
|
|
||||||
RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
||||||
RUN echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-20 main\ndeb-src https://apt.llvm.org/jammy/ llvm-toolchain-jammy-20 main" > /etc/apt/sources.list.d/llvm.list
|
RUN echo "deb https://apt.llvm.org/jammy/ llvm-toolchain-jammy-20 main\ndeb-src https://apt.llvm.org/jammy/ llvm-toolchain-jammy-20 main" > /etc/apt/sources.list.d/llvm.list
|
||||||
RUN apt-get update
|
RUN apt-get update
|
||||||
RUN apt-get install -y libllvm-20-ocaml-dev libllvm20 llvm-20 llvm-20-dev llvm-20-runtime
|
RUN apt-get install -y libllvm-20-ocaml-dev libllvm20 llvm-20 llvm-20-dev llvm-20-runtime
|
||||||
RUN apt-get install -y libclang-rt-20-dev-wasm32 libclang-rt-20-dev-wasm64 libc++-20-dev-wasm32 libc++abi-20-dev-wasm32 libclang-rt-20-dev-wasm32 libclang-rt-20-dev-wasm64
|
RUN apt-get install -y libclang-rt-20-dev-wasm32 libclang-rt-20-dev-wasm64 libc++-20-dev-wasm32 libc++abi-20-dev-wasm32 libclang-rt-20-dev-wasm32 libclang-rt-20-dev-wasm64
|
||||||
RUN apt-get update && apt-get install -y autoconf libtool build-essential pkgconf
|
RUN apt-get update && apt-get install -y autoconf libtool build-essential pkgconf
|
||||||
|
|
||||||
# libx264
|
|
||||||
WORKDIR /tmp/
|
|
||||||
|
|
||||||
RUN git clone https://code.videolan.org/videolan/x264.git
|
USER ${BUILD_USER}
|
||||||
|
|
||||||
WORKDIR /tmp/x264
|
|
||||||
|
|
||||||
RUN git checkout ${X264_COMMIT} && \
|
|
||||||
emconfigure ./configure \
|
|
||||||
--prefix=${PREFIX} \
|
|
||||||
--host=i686-gnu \
|
|
||||||
--enable-static \
|
|
||||||
--disable-cli \
|
|
||||||
--disable-asm \
|
|
||||||
--extra-cflags="-s USE_PTHREADS=1"
|
|
||||||
|
|
||||||
RUN emmake make && emmake make install
|
|
||||||
|
|
||||||
WORKDIR /tmp/
|
|
||||||
# libmp3lame
|
|
||||||
RUN wget -O lame-${LAME_VERSION}.tar.gz https://sourceforge.net/projects/lame/files/lame/${LAME_VERSION}/lame-${LAME_VERSION}.tar.gz/download && \
|
|
||||||
tar zxf lame-${LAME_VERSION}.tar.gz && rm lame-${LAME_VERSION}.tar.gz
|
|
||||||
|
|
||||||
WORKDIR /tmp/lame-${LAME_VERSION}
|
|
||||||
RUN emconfigure ./configure \
|
|
||||||
--prefix=${PREFIX} \
|
|
||||||
--host=i686-gnu \
|
|
||||||
--enable-static \
|
|
||||||
--disable-frontend
|
|
||||||
|
|
||||||
WORKDIR /tmp/lame-${LAME_VERSION}
|
|
||||||
RUN emmake make && emmake make install
|
|
||||||
|
|
||||||
# Get ffmpeg source.
|
# Get ffmpeg source.
|
||||||
WORKDIR /tmp/
|
WORKDIR /tmp/
|
||||||
@@ -59,49 +28,44 @@ ENV EM_PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig"
|
|||||||
# Compile ffmpeg.
|
# Compile ffmpeg.
|
||||||
WORKDIR /tmp/ffmpeg-${FFMPEG_VERSION}
|
WORKDIR /tmp/ffmpeg-${FFMPEG_VERSION}
|
||||||
RUN emconfigure ./configure \
|
RUN emconfigure ./configure \
|
||||||
--prefix=${PREFIX} \
|
--prefix=${PREFIX} \
|
||||||
--target-os=none \
|
--target-os=none \
|
||||||
--arch=x86_32 \
|
--arch=x86_32 \
|
||||||
--enable-cross-compile \
|
--enable-cross-compile \
|
||||||
--disable-debug \
|
--disable-debug \
|
||||||
--disable-x86asm \
|
--disable-x86asm \
|
||||||
--disable-inline-asm \
|
--disable-inline-asm \
|
||||||
--disable-stripping \
|
--disable-stripping \
|
||||||
--disable-programs \
|
--disable-programs \
|
||||||
--disable-doc \
|
--disable-doc \
|
||||||
--disable-all \
|
--disable-all \
|
||||||
--enable-avcodec \
|
--enable-avcodec \
|
||||||
--enable-avformat \
|
--enable-avformat \
|
||||||
--enable-avfilter \
|
--enable-avutil \
|
||||||
--enable-avdevice \
|
--enable-swresample \
|
||||||
--enable-avutil \
|
--enable-swscale \
|
||||||
--enable-swresample \
|
--enable-protocol=file \
|
||||||
--enable-swscale \
|
--enable-decoder=h264,hevc,vp8,vp9,av1,prores,aac,mp3,opus,vorbis,flac,alac,pcm_s16le,pcm_s16be,pcm_s24le,pcm_s24be \
|
||||||
--enable-protocol=file \
|
--enable-demuxer=mov,matroska,webm,mpegts,mxf,mp3,wav,ogg,avi,aiff,flac,hevc,h264,av1 \
|
||||||
--enable-decoder=h264,aac,pcm_s16le,mp3 \
|
--enable-parser=h264,hevc,vp8,vp9,av1,aac,mpegaudio,opus,vorbis,flac \
|
||||||
--enable-demuxer=mov,matroska,mp3 \
|
--extra-cflags="$CFLAGS" \
|
||||||
--enable-muxer=mp4 \
|
--extra-cxxflags="$CFLAGS" \
|
||||||
--enable-gpl \
|
--extra-ldflags="$LDFLAGS" \
|
||||||
--enable-libx264 \
|
--nm="llvm-nm-20 -g" \
|
||||||
--enable-libmp3lame \
|
--ar=emar \
|
||||||
--extra-cflags="$CFLAGS" \
|
--as=llvm-as \
|
||||||
--extra-cxxflags="$CFLAGS" \
|
--ranlib=llvm-ranlib-20 \
|
||||||
--extra-ldflags="$LDFLAGS" \
|
--cc=emcc \
|
||||||
--nm="llvm-nm -g" \
|
--cxx=em++ \
|
||||||
--ar=emar \
|
--objcc=emcc \
|
||||||
--as=llvm-as \
|
--dep-cc=emcc
|
||||||
--ranlib=llvm-ranlib \
|
|
||||||
--cc=emcc \
|
|
||||||
--cxx=em++ \
|
|
||||||
--objcc=emcc \
|
|
||||||
--dep-cc=emcc
|
|
||||||
|
|
||||||
RUN emmake make -j4 && \
|
RUN emmake make -j4 && \
|
||||||
emmake make install
|
emmake make install
|
||||||
|
|
||||||
|
|
||||||
COPY ./src/ffprobe-wasm-wrapper.cpp /build/src/ffprobe-wasm-wrapper.cpp
|
COPY --chown=${BUILD_USER}:${BUILD_USER} ./src/ffprobe-wasm-wrapper.cpp /build/src/ffprobe-wasm-wrapper.cpp
|
||||||
COPY ./Makefile /build/Makefile
|
COPY --chown=${BUILD_USER}:${BUILD_USER} ./Makefile /build/Makefile
|
||||||
|
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|
||||||
|
|||||||
19
Makefile
19
Makefile
@@ -1,13 +1,16 @@
|
|||||||
dist/ffprobe-wasm.js:
|
dist/ffprobe-wasm.mjs:
|
||||||
mkdir -p dist && \
|
mkdir -p dist && \
|
||||||
emcc --bind \
|
emcc --bind \
|
||||||
-O3 \
|
-O3 \
|
||||||
-L/opt/ffmpeg/lib \
|
-L/tmp/ffmpeg-build/lib \
|
||||||
-I/opt/ffmpeg/include/ \
|
-I/tmp/ffmpeg-build/include/ \
|
||||||
-s EXTRA_EXPORTED_RUNTIME_METHODS="[FS, cwrap, ccall, getValue, setValue, writeAsciiToMemory]" \
|
-s EXPORTED_RUNTIME_METHODS="[FS, cwrap, ccall, getValue, setValue, writeAsciiToMemory]" \
|
||||||
-s INITIAL_MEMORY=268435456 \
|
-s INITIAL_MEMORY=268435456 \
|
||||||
-lavcodec -lavformat -lavfilter -lavdevice -lswresample -lswscale -lavutil -lm -lx264 \
|
-s EXPORT_ES6=1 \
|
||||||
|
-s MODULARIZE=1 \
|
||||||
|
-s EXPORT_NAME="loadFFprobe" \
|
||||||
|
-lavcodec -lavformat -lswresample -lswscale -lavutil -lm \
|
||||||
-pthread \
|
-pthread \
|
||||||
-lworkerfs.js \
|
-lworkerfs.js \
|
||||||
-o dist/ffprobe-wasm.js \
|
-o dist/ffprobe-wasm.mjs \
|
||||||
src/ffprobe-wasm-wrapper.cpp
|
src/ffprobe-wasm-wrapper.cpp
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ FileInfoResponse get_file_info(std::string filename) {
|
|||||||
.level = (int)pLocalCodecParameters->level,
|
.level = (int)pLocalCodecParameters->level,
|
||||||
.width = (int)pLocalCodecParameters->width,
|
.width = (int)pLocalCodecParameters->width,
|
||||||
.height = (int)pLocalCodecParameters->height,
|
.height = (int)pLocalCodecParameters->height,
|
||||||
.channels = (int)pLocalCodecParameters->channels,
|
.channels = (int)pLocalCodecParameters->ch_layout.nb_channels,
|
||||||
.sample_rate = (int)pLocalCodecParameters->sample_rate,
|
.sample_rate = (int)pLocalCodecParameters->sample_rate,
|
||||||
.frame_size = (int)pLocalCodecParameters->frame_size,
|
.frame_size = (int)pLocalCodecParameters->frame_size,
|
||||||
};
|
};
|
||||||
@@ -165,7 +165,6 @@ FileInfoResponse get_file_info(std::string filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
r.streams.push_back(stream);
|
r.streams.push_back(stream);
|
||||||
free(fourcc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop through the chapters (if any).
|
// Loop through the chapters (if any).
|
||||||
@@ -227,7 +226,7 @@ FramesResponse get_frames(std::string filename, int timestamp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get streams data.
|
// Get streams data.
|
||||||
AVCodec *pCodec = NULL;
|
const AVCodec *pCodec = NULL;
|
||||||
AVCodecParameters *pCodecParameters = NULL;
|
AVCodecParameters *pCodecParameters = NULL;
|
||||||
int video_stream_index = -1;
|
int video_stream_index = -1;
|
||||||
int nb_frames = 0;
|
int nb_frames = 0;
|
||||||
@@ -238,7 +237,7 @@ FramesResponse get_frames(std::string filename, int timestamp) {
|
|||||||
pLocalCodecParameters = pFormatContext->streams[i]->codecpar;
|
pLocalCodecParameters = pFormatContext->streams[i]->codecpar;
|
||||||
|
|
||||||
// Print out the decoded frame info.
|
// Print out the decoded frame info.
|
||||||
AVCodec *pLocalCodec = avcodec_find_decoder(pLocalCodecParameters->codec_id);
|
const AVCodec *pLocalCodec = avcodec_find_decoder(pLocalCodecParameters->codec_id);
|
||||||
if (pLocalCodecParameters->codec_type == AVMEDIA_TYPE_VIDEO) {
|
if (pLocalCodecParameters->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||||
if (video_stream_index == -1) {
|
if (video_stream_index == -1) {
|
||||||
video_stream_index = i;
|
video_stream_index = i;
|
||||||
@@ -296,7 +295,7 @@ FramesResponse get_frames(std::string filename, int timestamp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Track keyframes so we paginate by each GOP.
|
// Track keyframes so we paginate by each GOP.
|
||||||
if (pFrame->key_frame == 1) key_frames++;
|
if (pFrame->flags & AV_FRAME_FLAG_KEY) key_frames++;
|
||||||
|
|
||||||
// Break at the next keyframe found.
|
// Break at the next keyframe found.
|
||||||
if (key_frames > 1) break;
|
if (key_frames > 1) break;
|
||||||
@@ -307,7 +306,7 @@ FramesResponse get_frames(std::string filename, int timestamp) {
|
|||||||
.pts = (int) pPacket->pts,
|
.pts = (int) pPacket->pts,
|
||||||
.dts = (int) pPacket->dts,
|
.dts = (int) pPacket->dts,
|
||||||
.pos = (int) pPacket->pos,
|
.pos = (int) pPacket->pos,
|
||||||
.pkt_size = pFrame->pkt_size,
|
.pkt_size = pPacket->size,
|
||||||
};
|
};
|
||||||
r.frames.push_back(f);
|
r.frames.push_back(f);
|
||||||
|
|
||||||
@@ -399,4 +398,4 @@ EMSCRIPTEN_BINDINGS(structs) {
|
|||||||
.field("avg_frame_rate", &FramesResponse::avg_frame_rate)
|
.field("avg_frame_rate", &FramesResponse::avg_frame_rate)
|
||||||
;
|
;
|
||||||
function("get_frames", &get_frames);
|
function("get_frames", &get_frames);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user