美文网首页
RTMP,X264与交叉编译

RTMP,X264与交叉编译

作者: Coder_Sven | 来源:发表于2018-11-17 17:45 被阅读0次

    1,RTMP

    与HTTP(超文本传输协议)同样是一个基于TCP的Real Time Messaging Protocol(实时消息传输协议)。由Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的一种开放协议 。在国内被广泛的应用于直播领域。HTTP默认端口为80,RTMP则为1935。

    2,RTMPDump

    RTMPDump 是一个用来处理RTMP流媒体的开源工具包。它能够单独使用进行RTMP的通信,也可以集成到FFmpeg中通过FFmpeg接口来使用RTMPDump。

    ​ RTMPDump源码下载:http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz

    ​ 在Android中可以直接借助NDK在JNI层调用RTMPDump来完成RTMP通信。但是首先必须得进行交叉编译。

    RTMPDump源码结构如下:


    13903992-b56a40e934d00f1f.webp.jpg

    ​ 在根目录下提供了一个Makefile与一些.c源文件。这里的源文件将会编译出一系列的可执行文件。然后我们需要的并不是可执行文件,真正的对RTMP的实现都在librtmp子目录中。在这个子目录中同样包含了一个Makefile文件。通过阅读Makefile发现,它的源码并不多:OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o。因此我们不进行预编译,即直接放入AS中借助CMakeLists.txt来进行编译。这么做可以让我们方便的对库本身进行调试或修改(实际上我们确实会稍微修改这个库的源码)。

    ​ 在AS中复制librtmp置于:src/main/cpp/librtmp,并为其编写CMakeLists.txt

    cmake_minimum_required(VERSION 3.4.1)
    
    #预编译宏
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")
    
    
    #所有源文件放入 rtmp_source 变量
    file(GLOB rtmp_source *.c)
    
    #编译静态库
    add_library(rtmp STATIC ${rtmp_source} )
    

    app/CMakeLists.txt中导入这个CMakeLists.txt

    cmake_minimum_required(VERSION 3.4.1)
    #导入其他目录cmakelist
    add_subdirectory(src/main/cpp/librtmp)
    add_library(XXX SHARED ...)
    #XXX需要链接rtmp库
    target_link_libraries(XXX rtmp ...)
    

    3,x264

    x264是一个C语言编写的目前对H.264标准支持最完善的编解码库。与RTMPDump一样同样直接在Android中使用,也可以集成进入FFMpeg。

    https://www.videolan.org/developers/x264.html

    在Android中使用x264,首先需要交叉编译出x264的静/动态库

    1,在linux下载编译:

    wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
    tar xvf last_x264.tar.bz2
    

    2,进入x264目录,创建build.sh编译脚本

    vim build.sh
    
    #!/bin/bash
    
    PREFIX=./android/armeabi-v7a
    
    TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    
    FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=17 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
    #--disable-cli 不需要命令行工具
    #--enable-static 静态库
    #和ffmpeg差不多
    ./configure \
    --prefix=$PREFIX \
    --disable-cli \
    --enable-static \
    --enable-pic \
    --host=arm-linux \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$NDK_ROOT/platforms/android-17/arch-arm \
    --extra-cflags="$FLAGS"
    
    make clean
    make install
    

    但是编译x264我们需要注意一点,x264在进行环境检测的时候,使用的是比较宽松的方式,对于我们目前需要编译的android-17为目标来说,编译出的库在使用上会出现问题(对于18以上不会)。(为什么有问题,录了小视频)

    我们需要修改configure脚本,在脚本中搜索cc_check

    vim如何搜索:在vim里底线命令模式,输入 /cc_check

    cc_check() {
        ......
        if [ $compiler_style = MS ]; then
            cc_cmd="$CC conftest.c -Werror=implicit-function-declaration  $(cc_cflags $CFLAGS $CHECK_CFLAGS $2) -link $(cl_ldflags $2 $LDFLAGSCLI $LDFLAGS)"
        else
            cc_cmd="$CC conftest.c -Werror=implicit-function-declaration  $CFLAGS $CHECK_CFLAGS $2 $LDFLAGSCLI $LDFLAGS -o conftest"
        fi
        ......
    }  
    

    cc_cmd内添加 -Werror=implicit-function-declaration

    3,执行./build.sh(第一次编译需要添加权限 chmod +x build.sh)

    生成好的包会在android目录下

    将这个目录下的include和lib目录中的内容都copy放到项目的app/src/main/cpp下

    4,效果测试

    结合上一篇的nginx服务器介绍,启动nginx服务器,然后下载项目中的代码

    https://github.com/games2sven/RTMPush

    将项目中的代码

     livePusher.startLive("rtmp://192.168.1.82/myapp/mystream");
    

    改为nginx服务器中配置的ip和名称信息,然后就可以正常推流到服务器了,再使用Evplayer或者其他可以播放rtmp网络流的播放器,可以正常播放

    注意代码中没有考虑动态权限问题,如果在手机6.0以上系统测试需要主动打开应用的相机权限和录音权限!

    相关文章

      网友评论

          本文标题:RTMP,X264与交叉编译

          本文链接:https://www.haomeiwen.com/subject/lsxifqtx.html