Android下RTMP推流h264和aac数据

本文介绍了在Android平台上使用RTMP推流h264和aac数据的方法,包括Nginx搭建RTMP服务器、h264与AAC的编码、RtmpDump的使用,以及在Java层利用AudioRecord和Camera2进行数据采集,并在native层进行编码和打包。详细阐述了VideoChannel和AudioChannel的初始化、编码过程,以及AAC编码帧的ADTS头处理。提供了一个GitHub项目链接以供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RTMP服务器搭建参考:mac下Nginx搭建RTMP服务器_macos nginx-rtmp-module-优快云博客

h264格式,aac格式,rtmppacket格式参考:h264、AAC组装RTMPPacket_h264packager-优快云博客

环境:

RtmpDump c文件少,可以直接引入源文件,配置针对rtmpdump的cmakelist。

ndk 交叉编译android 平台下的 faac x264静态库,引入。

faac作用:将AudioRecord录制的pcm编码成aac。

x264作用:将camera2输出的原始图像,编码成h264.

rtmpdump:连接rtmp服务器,将aac和h264各自打包RtmpPacket,实现推流。

Java层AudioRecord和Camera2就不介绍了,直接进入native中开始讲解。

先看一下几个native 方法的作用。

public class RtmpPush {
    static {
        System.loadLibrary("rtmpPush");
    }
 
    /**
     * 创建x264编码类和faac编码类
     */
    public static native void native_init();
 
    /**
     * 连接rtmp服务器,推流开始
     * @param path
     */
    public static native void native_start(String path);
 
    /**
     * 初始化x264配置
     * @param width
     * @param height
     * @param fps
     * @param bitrate
     */
    public static native void native_setVideoEncInfo(int width, int height, int fps, int bitrate);
 
    /**
     * yuv输入编码,推流
     * @param ydata
     * @param yLen
     */
    public static native void native_pushVideo(
            byte[] ydata, int yLen
    );
 
    public static native void native_stop();
 
    public static native void native_release();
 
    /**
     * 初始化faac配置
     * @param sampleRateInHz
     * @param channels
     */
    public static native void native_setAudioEncInfo(int sampleRateInHz, int channels);
 
    /**
     * 获取faac 输入buffer的大小,配置audioRecord的输入buffer大小
     * @return
     */
    public static native int getInputSamples();
 
    /**
     * pcm编码aac,推流
     * @param data
     */
    public static native void native_pushAudio(byte[] data);
 
}

native_init

extern "C"
JNIEXPORT void JNICALL
Java_com_example_rtmppushdemo_RtmpPush_native_1init(JNIEnv *env, jclass instance) {
 
    videoChannel = new VideoChannel();
    videoChannel->setVideoCallBack(callback);
 
    audioChannel = new AudioChannel();
    audioChannel->setAudioCallBack(callback);
    packets.setReleaseCallback(releasePackets);
 
}

创建VideoChannel和AudioChannel。

VideoChannel:负责编码h264和组装rtmp。

AudioChannel:负责编码aac和组装rtmp。

native_start

void *task_start(void *args) {
    char *url = static_cast<char *>(args);
    RTMP *rtmp = 0;
    do {
        rtmp = RTMP_Alloc();
 
        if (!rtmp) {
            LOGE("alloc rtmp失败");
            break;
        }
 
        RTMP_Init(rtmp);
        int ret = RTMP_SetupURL(rtmp, url);
        if (!ret) {
            LOGE("设置地址失败:%s", url);
            break;
        }
 
        rtmp->Link.timeout = 5;
        RT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值