正在做一个基于RTMP+H264的手机端实时视频流项目。
按以前的方案需要分别用librtmp/JUV和opencore的H264解码库实现。
在进一步了解FFmpeg后,决定全部使用ffmpeg来实现。
当然,在手机客户端上,多余的解码库是不需要的。因此需要对ffmpeg精简配置,最终jni代码编译链接 libavcodec.a libavformat.a libavutil.a libswscale.a 后的so大小控制在1.2M左右,打包到apk后压缩到456k。
配置如下
build_i386
- #!/bin/bash
- ./configure --disable-yasm --prefix=/usr --enable-small --disable-debug
- --cc="ccache gcc" --disable-ffmpeg --disable-ffplay --disable-ffprobe
- --disable-ffserver --disable-everything --enable-protocol=rtmp
- --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264
- --disable-parsers --enable-parser=h264 --enable-parser=aac
- --disable-decoders --enable-decoder=h264 --enable-decoder=rawvideo
build_armeabi
- #!/bin/bash
- NDKRROOT=/home/aliang/Application/android-ndk
- PREBUILT=$NDKRROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
- PLATFORM=$NDKRROOT/platforms/android-8/arch-arm
- export PATH=$PATH:$PREBUILT/bin
- ./configure --prefix=$PWD/armeabi --arch=arm --target-os=linux
- --enable-cross-compile
- --extra-cflags="-I$PLATFORM/usr/include -O3 -msoft-float"
- --extra-ldflags="-L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl"
- --cc="ccache arm-linux-androideabi-gcc" --enable-small
- --disable-debug --cross-prefix=arm-linux-androideabi-
- --disable-ffmpeg --disable-ffplay --disable-ffprobe
- --disable-ffserver --disable-encoders --disable-muxers
- --disable-filters --disable-bsfs --disable-indevs
- --disable-outdevs --disable-protocols --enable-protocol=rtmp
- --disable-demuxers --enable-demuxer=flv --enable-demuxer=h264
- --disable-parsers --enable-parser=h264 --enable-parser=aac
- --disable-decoders --enable-decoder=h264 --enable-decoder=rawvideo
- --enable-dct --enable-dwt --enable-lsp --enable-mdct --enable-rdft
- --enable-fft
build_armeabi-v7a
- #!/bin/bash
- NDKRROOT=/home/aliang/Application/android-ndk
- PREBUILT=$NDKRROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
- PLATFORM=$NDKRROOT/platforms/android-8/arch-arm
- export PATH=$PATH:$PREBUILT/bin
- ./configure --prefix=$PWD/armeabi-v7a --arch=arm --target-os=linux
- --enable-cross-compile
- --extra-cflags="-I$PLATFORM/usr/include -O3 -march=armv7-a -mfpu=neon -mfloat-abi=softfp"
- --extra-ldflags="-L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl" --cc="ccache arm-linux-androideabi-gcc"
- --enable-small --disable-debug --cross-prefix=arm-linux-androideabi-
- --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver
- --disable-encoders --disable-muxers --disable-filters --disable-bsfs
- --disable-indevs --disable-outdevs --disable-protocols
- --enable-protocol=rtmp --disable-demuxers --enable-demuxer=flv
- --enable-demuxer=h264 --disable-parsers --enable-parser=h264
- --enable-parser=aac --disable-decoders --enable-decoder=h264
- --enable-decoder=rawvideo --enable-dct --enable-dwt --enable-lsp
- --enable-mdct --enable-rdft --enable-fft
最大的好处就是统一了代码实现,在我们的IOS平台上可以使用相同的代码。
参考:
- http://stackoverflow.com/questions/9251747/record-rtsp-stream-with-ffmpeg-libavformat
- https://github.com/lajos/iFrameExtractor
(bashell) |