直播 android端推流實現一

2021-09-23 22:12:56 字數 3471 閱讀 8413

h264編碼是得到連續的流,流中有很多幀(i幀稱為關鍵幀,p幀,b幀)。要想傳遞給伺服器的資料是不丟幀的,需要對流進行重新打亂,比如第一段先傳i幀資料報,再傳b幀資料報等。這個傳遞給伺服器的工具就是rtmpdump,它是真正實現擺放資料的,會將h264資料轉成packet,推到伺服器。它是遵循rtmp協議的。這種協議就保證了流在傳遞的過程中不丟幀。

2、在linux環境解壓,將解壓得到的librtmp資料夾拷貝到專案中的cpp目錄下。

3、在當前librtmp資料夾下建立cmakelists.txt,編寫cmake,生成rtmp靜態庫,**如下:

cmake_minimum_required(version 3.4.1)

set(cmake_c_flags "$")

#所有的.c檔案編譯成靜態庫rtmp

add_library(

rtmp

static

amf.c

hashswf.c

log.c

parseurl.c

rtmp.c

)

試著編譯,發現編譯失敗,定位到**

#設定編譯器為c編譯器 -dno_crypto為定義巨集變數no_crypto

set(cmake_c_flags "$ -dno_crypto")

#所有的.c檔案編譯成靜態庫rtmp

add_library(

rtmp

static

amf.c

hashswf.c

log.c

parseurl.c

rtmp.c

)4、將我們編譯的靜態庫連線到動態庫native-lib中,編寫專案的cmakelist.txt,**如下:

cmake_minimum_required(version 3.4.1)

#將外部編譯的檔案引入進來

add_subdirectory(librtmp)

#新增動態庫

add_library(

native-lib

shared

native-lib.cpp)

find_library(

log-lib

log)

target_link_libraries(

native-lib

#靜態庫rtmp編譯到native-lib中

rtmp

$)

這樣就完成了rtmp的整合。

x264是乙個c語言編寫的目前對h.264標準支援最完善的編譯碼庫。與rtmpdump一樣同樣直接在android中使用,也可以整合進入ffmpeg。在android中使用x264,首先需要預編譯出x264的靜/動態庫。

1、linux環境進入x264目錄,編寫生成靜態庫編譯指令碼build.sh。**如下

#!/bin/bash

prefix=./android/armeabi-v7a

ndkroot=/root/android-ndk-r17c

toolchain=$ndkroot/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

flags="-isysroot $ndkroot/sysroot -isystem $ndkroot/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 \

--disable-asm \

--enable-static \

--enable-pic \

--host=arm-linux \

--cross-prefix=$toolchain/bin/arm-linux-androideabi- \

--sysroot=$ndkroot/platforms/android-17/arch-arm \

--extra-cflags="$flags"

make clean

make install

執行sh build.sh命令,會在當前目錄下生成android/armeabi-v7a。

2、將標頭檔案拷貝到cpp目錄下的include資料夾下,將靜態庫拷貝到cpp/libs/armeabi-v7a目錄下

3、將我們編譯的靜態庫連線到動態庫native-lib中,編寫專案的cmakelist.txt,**如下:

cmake_minimum_required(version 3.4.1)

#將外部編譯的檔案引入進來

add_subdirectory(librtmp)

#新增動態庫

add_library(

native-lib

shared

native-lib.cpp)

#-l代表路徑

#cmake_source_dir當前工程目錄

#cmake_android_api內建變數指向armeabi-v7a

set(my_lib_path $/libs/$)

set(cmake_cxx_flags "$ -l$")

#匯入標頭檔案

include_directories(include)

find_library(

log-lib

log)

target_link_libraries(

native-lib

#靜態庫rtmp編譯到native-lib中

rtmp

x264

$)

這樣就完成了x264的整合。

附件:完整的x264與rtmp配置文件

直播Android推流外部資料採集

有些研發能力比較強的客戶,會有自定義影象處理的需求 比如自定義影象濾鏡 同時又希望復用rtmp sdk的整體流程,如果是這樣,您可以按照如下攻略進行定製。custommode txliveconstants.custom mode audio preprocess 可以和video preproce...

Linux直播推流

linux系統實現youtube推流直播 軟體 ffmpeg,youtube dl 1.安裝ffmpeg 官網安裝包 john van sickle ffmpeg static builds cd home john wget wget md5 md5sum c ffmpeg git amd64 s...

ffmpeg使用指令實現推流實現直播流程

windows下用ffmpeg nginx rtmp搭建直播環境 實現推流 拉流 啟動nginx 進入nginx的目錄,執行其中rtmp檔案。執行下列 cd g studyprojects setupvideoservice nginx 1.7.11 3 gryphon nginx.exe c co...