diff --git a/Dockerfile b/Dockerfile index dc65683..e4a8c6e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,85 @@ -FROM alpine:latest AS builder +FROM alpine:3.20 AS builder + +# Build FFmpeg. +RUN apk add --no-cache \ + rust \ + cargo \ + fdk-aac \ + fdk-aac-dev \ + clang16 \ + clang16-static \ + clang16-libclang \ + llvm16-dev \ + libc-dev \ + pkgconf \ + git \ + build-base \ + nasm \ + yasm \ + aom-dev \ + dav1d-dev \ + lame-dev \ + opus-dev \ + svt-av1-dev \ + libvorbis-dev \ + libvpx-dev \ + x264-dev \ + x265-dev \ + numactl-dev \ + libass-dev \ + libunistring-dev \ + gnutls-dev && \ + mkdir -p /ffmpeg/{ffmpeg_build,bin} && \ + cd /ffmpeg && \ + wget -O ffmpeg-7.0.1.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.0.1.tar.bz2 && \ + tar xjvf ffmpeg-7.0.1.tar.bz2 && \ + cd ffmpeg-7.0.1 && \ + PKG_CONFIG_PATH="/ffmpeg/ffmpeg_build/lib/pkgconfig" ./configure \ + --prefix="/ffmpeg/ffmpeg_build" \ + --pkg-config-flags="--static" \ + --extra-cflags="-I/ffmpeg/ffmpeg_build/include" \ + --extra-ldflags="-L/ffmpeg/ffmpeg_build/lib" \ + --extra-libs="-lpthread -lm" \ + --ld="g++" \ + --bindir="/ffmpeg/bin" \ + --enable-gpl \ + --enable-gnutls \ + --enable-libaom \ + --enable-libass \ + --enable-libfdk-aac \ + --enable-libfreetype \ + --enable-libmp3lame \ + --enable-libopus \ + --enable-libsvtav1 \ + --enable-libdav1d \ + --enable-libvorbis \ + --enable-libvpx \ + --enable-libx264 \ + --enable-libx265 \ + --enable-nonfree && \ + PATH="/ffmpeg/bin:$PATH" make -j$(nproc) && \ + make install && \ + hash -r + +# Build the app. WORKDIR /build COPY ./ ./ -ARG PKG_CONFIG_PATH=/usr/lib/pkgconfig -RUN apk add --no-cache ffmpeg-libs ffmpeg-dev clang16 clang16-libclang pkgconf rust cargo -RUN cd /build && cargo build --release +RUN cd /build && \ + export PKG_CONFIG_PATH="/ffmpeg/ffmpeg_build/lib/pkgconfig" && \ + cargo build --verbose --release -FROM alpine:latest +FROM alpine:3.20 WORKDIR / -RUN apk add --no-cache ffmpeg-libavutil ffmpeg-libavformat ffmpeg-libavfilter ffmpeg-libavdevice dumb-init mailcap tzdata +RUN apk add --no-cache \ + ffmpeg-libavutil \ + ffmpeg-libavformat \ + ffmpeg-libavfilter \ + ffmpeg-libavdevice \ + fdk-aac \ + dumb-init \ + mailcap \ + tzdata \ + gnutls COPY --from=builder /build/target/release/atranscoder-rpc /usr/local/bin EXPOSE 8090 ENTRYPOINT ["/usr/bin/dumb-init", "--", "/usr/local/bin/atranscoder-rpc"] diff --git a/Dockerfile.scratch b/Dockerfile.scratch deleted file mode 100644 index d7bfce2..0000000 --- a/Dockerfile.scratch +++ /dev/null @@ -1,75 +0,0 @@ -# Initially I wanted to build a slim image using this Dockerfile and static linking. -# It would use something like this in Cargo.toml: -# -# [build-dependencies.clang] -# version = "2.0.0" -# default-features = false -# features = ["static"] -# -# [build-dependencies.clang-sys] -# version = "1.7.0" -# default-features = false -# features = ["clang_16_0", "static"] -# -# But there are a lot of problems with static linking and clang & clang-sys crates: -# - https://github.com/KyleMayes/clang-sys/issues/174 -# - https://github.com/KyleMayes/clang-rs/issues/17 -# - https://github.com/KyleMayes/clang-sys/issues/148 (this is the one I *like* the most!) -# -# So, no static linking for now, but I don't wanna erase all this gorgeous Dockerfile code, so... I'll let it linger -# in the repo for now. - -# Stage 1: Build the Rust application -FROM rust:1.78-alpine AS builder - -# Set the working directory -WORKDIR /usr/src/ - -# Install necessary packages -RUN apk add --no-cache \ - ffmpeg-libs \ - ffmpeg-dev \ - pkgconf \ - musl-dev \ - clang16-static \ - llvm-dev \ - zlib-dev \ - libffi-dev \ - ncurses-dev \ - gcc \ - g++ \ - git \ - build-base - -# Add target for musl -RUN rustup target add x86_64-unknown-linux-musl - -# Create a new Rust project -RUN USER=root cargo new atranscoder-rpc -WORKDIR /usr/src/atranscoder-rpc - -# Copy the manifest and lock files -COPY Cargo.toml Cargo.lock ./ - -# Set the environment variable for libclang path -ENV LIBCLANG_PATH=/usr/lib/llvm16/lib -ENV PKG_CONFIG_PATH=/usr/lib/pkgconfig - -# Build dependencies to cache them -RUN cargo build --release --target x86_64-unknown-linux-musl - -# Copy the source code -COPY src ./src - -# Build the project and install the binary -RUN cargo install --target x86_64-unknown-linux-musl --path . && \ - mkdir -p /result/{tmp,bin} && \ - mv /usr/local/cargo/bin/atranscoder-rpc /result/bin - -# Stage 2: Create the final minimal image -FROM scratch -COPY --from=builder /usr/bin/dumb-init /bin/ -COPY --from=builder /result/bin /bin -COPY --from=builder /result/tmp /tmp -EXPOSE 8090 -ENTRYPOINT ["/bin/dumb-init", "--", "/bin/atranscoder-rpc"] diff --git a/src/transcoder.rs b/src/transcoder.rs index 73e2fdf..0dd1b77 100644 --- a/src/transcoder.rs +++ b/src/transcoder.rs @@ -67,9 +67,6 @@ impl Transcoder { encoder.set_rate(sample_rate); encoder.set_channel_layout(params.channel_layout); - #[cfg(not(feature = "ffmpeg_7_0"))] - encoder.set_channels(params.channel_layout.channels()); - encoder.set_format( codec .formats()