正在做一个基于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
1 2 |
#!/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
1 2 3 4 5 6 |
#!/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
1 2 3 4 5 6 |
#!/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
原创文章,转载请注明: 转载自贝壳博客
本文链接地址: 使用ffmpeg-1.0内置RTMP协议实时解码H264视频流
请问您是如何调用ffmpeg的,可以发布一下源码么?感激不尽
不好意思 源码不方便分享 但你看上面的参考代码,在结合JNI就能封装出来
您好,最近对ffmpeg1.0(官网下载最新)源码进行android移植时遇到一些疑惑,我是win7-64的系统,用的cygwin,在最后so文件的编译时出现如下错误use_yg@LP0201 /cygdrive/f/Android/android-ndk-r8c/ffmpeg1.0$ $ndk/ndk-buildjni/ffmpeg/libavcodec/Makefile:1: *** 分離記号を欠いています. 中止.对ffmpeg源码目录中的libavcodev,libavfilter,libavformat,libavutil,libpostproc,libswscale中的Makefile,我是这样操作的,将Makefile中的开头:include $(SUBDIR)../config.mak都注释掉。也是在网上边学边做,不知博主能否抽出点宝贵的时间~谢谢
不知道是否愿意加入我们团队 正准备做视频/语音通话这块 QQ 9942037
博主你好,你的博客很好,数字鸡巴论坛(www.dgcock.com)想跟你交换友情链接,可以的话请发送邮件到shuzijiba@qq.com联系我,期待答复
楼主可以方便把你的config.sh配置公开不,我的编译好静态库
avformat_open_input打开rtmp视频流老是返回负值,我的视频流是没有问题,用其它软件可以打开,但是在ANDROID下面就不行
#!/bin/bash
PREBUILT=${NDK_ROOT}/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
PLATFORM=android-18
ARCH=–arch=arm
./configure
${ARCH}
–target-os=linux –enable-cross-compile –cross-prefix=${PREBUILT}/bin/arm-linux-androideabi-
–extra-cflags=" -fPIC -DANDROID -std=c99 "
–enable-version3
–enable-gpl
–enable-nonfree
–disable-stripping
–disable-ffmpeg
–disable-ffplay
–disable-ffserver
–disable-ffprobe
–disable-encoders
–enable-protocol=rtmp
–disable-devices
–disable-demuxers
–enable-demuxer=flv
–enable-avfilter
–enable-network
–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
–disable-avdevice
–disable-asm
–enable-neon
–enable-armv5te
–sysinclude=${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/include
–extra-ldflags="-Wl,-rpath-link=${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib -L${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib -nostdlib ${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib/crtbegin_static.o ${NDK_ROOT}/platforms/${PLATFORM}/arch-arm/usr/lib/crtend_android.o -lc -lm -ldl "
这是我的配置,里面又加了一些楼主的配置,我的NDK9
avformat_open_input的时候返回值,始终是-1330794744,我用的FFMPEG2.0
你这问题解决了吗? 我也遇到同样的问题
楼主可都指点一下,不胜感激
avformat_network_init(); 这个调用了么?
您好,楼主,我现在遇到问题是编译的时候出错了,configure按照您的指令,【ccKxg8Cg.s:1834: Error: unshifted register required — `eor r2,r3,r3,ror#16’】这是错误信息,使用的是ffmpeg1.1.4。指导一下吧谢谢。
你好,请问你这个问题解决了么
牛人,我们需要使用的ffpmeg实时解码网络流媒体然后建立一个本地的流,这块想找个牛人开发,我们有一个别人开发的APK做参考,如果你有时间,请联系我:QQ362837270 周先生!