精华内容
下载资源
问答
  • //input: /storage/emulated/0/aaaaa/dst.mp4 //output: rtmp://192.168.18.231:8082/live/room int ret = publish_file_stream(input, output); env->ReleaseStringUTFChars(input_, input); env->...

    static int (const char *input, const char *output){

    AVFormatContext *pInAvFormatContext = NULL;

    AVFormatContext *pOutAvFormatContext = NULL;

    AVOutputFormat *pAvOutputFormat = NULL;

    int videoIndex = 0;

    //1. 注册

    av_register_all();

    LOGE("%s", output);

    //2. 获取输入的文件信息

    //打开文件

    if (avformat_open_input(&pInAvFormatContext, input, NULL, NULL) != 0) {

    LOGE("打开文件失败!");

    return -1;

    }

    //获取流信息

    if (avformat_find_stream_info(pInAvFormatContext, NULL) < 0) {

    LOGE("获取文件流失败!");

    return -1;

    }

    //找到video的对应位置

    int i = 0;

    for (; i < pInAvFormatContext->nb_streams; i++) {

    if (pInAvFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {

    videoIndex = i;

    break;

    }

    }

    //打印信息

    // av_dump_format(pAvFormatContext,0,input,0);

    //3. 输出设置

    //初始化输出AVFormatContext获取 AVOutputFormat进行设置

    avformat_alloc_output_context2(&pOutAvFormatContext, NULL, "flv", output);

    if (!pOutAvFormatContext) {

    LOGE("初始化输出AVFormatContext失败");

    return -1;

    }

    pAvOutputFormat = pOutAvFormatContext->oformat;

    i = 0;

    for (; i < pInAvFormatContext->nb_streams; i++) {

    AVStream *in_stream = pInAvFormatContext->streams[i];

    AVStream *out_stream = avformat_new_stream(pOutAvFormatContext, in_stream->codec->codec);

    if (!out_stream) {

    LOGE("初始化out_stream失败");

    return -1;

    }

    //复制AVCodecContext的设置(Copy the settings of AVCodecContext)

    if (avcodec_copy_context(out_stream->codec, in_stream->codec) != 0) {

    LOGE("copy AVCodecContext设置失败");

    return -1;

    }

    out_stream->codec->codec_tag = 0;

    if (pOutAvFormatContext->oformat->flags & AVFMT_GLOBALHEADER)

    out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;

    }

    //打印

    // av_dump_format(pOutAvFormatContext,0,output,0);

    //打开输出文件/url

    if (!(pAvOutputFormat->flags & AVFMT_NOFILE)) {

    int ret = avio_open(&pOutAvFormatContext->pb, output, AVIO_FLAG_WRITE);

    if (ret < 0) {

    LOGE("打开输出文件或者url失败 %d", ret);

    return -1;

    }

    }

    //4.写入数据

    //写文件头

    if (avformat_write_header(pOutAvFormatContext, NULL) != 0) {

    LOGE("写入头数据失败");

    return -1;

    }

    int64_t start_time = av_gettime();

    AVPacket pkt;

    int frameIndex = 0;

    //写入数据源

    while (av_read_frame(pInAvFormatContext, &pkt) >= 0) {

    AVStream *in_stream, *out_stream;

    if (pkt.pts == AV_NOPTS_VALUE) {

    //Write PTS

    AVRational time_base1 = pInAvFormatContext->streams[videoIndex]->time_base;

    //Duration between 2 frames (us)

    int64_t calc_duration = (double) AV_TIME_BASE /

    av_q2d(pInAvFormatContext->streams[videoIndex]->r_frame_rate);

    //Parameters

    pkt.pts = (double) (frameIndex * calc_duration) /

    (double) (av_q2d(time_base1) * AV_TIME_BASE);

    pkt.dts = pkt.pts;

    pkt.duration = (double) calc_duration / (double) (av_q2d(time_base1) * AV_TIME_BASE);

    }

    //Important:Delay

    if (pkt.stream_index == videoIndex) {

    AVRational time_base = pInAvFormatContext->streams[videoIndex]->time_base;

    AVRational time_base_q = {1, AV_TIME_BASE};

    int64_t pts_time = av_rescale_q(pkt.dts, time_base, time_base_q);

    int64_t now_time = av_gettime() - start_time;

    if (pts_time > now_time)

    av_usleep(pts_time - now_time);

    }

    in_stream = pInAvFormatContext->streams[pkt.stream_index];

    out_stream = pOutAvFormatContext->streams[pkt.stream_index];

    /* copy packet */

    //转换PTS/DTS(Convert PTS/DTS)

    pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base,

    (AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));

    pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base,

    (AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));

    pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);

    pkt.pos = -1;

    //Print to Screen

    if (pkt.stream_index == videoIndex) {

    LOGE("Send %8d video frames to output URLn", frameIndex);

    frameIndex++;

    }

    if (av_interleaved_write_frame(pOutAvFormatContext, &pkt) < 0) {

    LOGE("Error muxing packetn");

    break;

    }

    av_packet_unref(&pkt);

    }

    //写文件尾(Write file trailer)

    av_write_trailer(pOutAvFormatContext);

    avformat_close_input(&pInAvFormatContext);

    /* close output */

    if (pOutAvFormatContext && !(pAvOutputFormat->flags & AVFMT_NOFILE))

    avio_close(pOutAvFormatContext->pb);

    avformat_free_context(pOutAvFormatContext);

    return 0;

    }

    JNIEXPORT jint JNICALL

    Java_zzw_com_ffmpegdemo_VideoUtils_publish_1file_1stream(JNIEnv *env, jclass type, jstring input_,

    jstring output_) {

    const char *input = env->GetStringUTFChars(input_, 0);

    const char *output = env->GetStringUTFChars(output_, 0);

    //input: /storage/emulated/0/aaaaa/dst.mp4

    //output: rtmp://192.168.18.231:8082/live/room

    int ret = publish_file_stream(input, output);

    env->ReleaseStringUTFChars(input_, input);

    env->ReleaseStringUTFChars(output_, output);

    return ret;

    }

    展开全文
  • 它使用MediaCodec系统接口对H.264和AAC进行硬编码,封装FLV格式,推送RTMP服务器。延迟达到毫秒级别。特性列表:Android Min API 16 (Android 4.1 Jelly Bean)H.264/AAC硬编码RTMP推流,事件状态回调手机横竖屏...

    Yasea是一个100%纯Java写的,完全开源的安卓直播推流客户端。它使用MediaCodec系统接口对H.264和AAC进行硬编码,封装FLV格式,推送至RTMP服务器。延迟达到毫秒级别。

    特性列表:

    Android Min API 16 (Android 4.1 Jelly Bean)

    H.264/AAC硬编码

    RTMP推流,事件状态回调

    手机横竖屏动态切换

    前后摄像头热切换

    推流过程随时录制MP4,支持暂停和恢复

    下面是yasea-master的工程源码截图:

    930677dd7fa08d29cc643d8ac3701461.png

    编译之后,生成apk,在android机器上即可安装运行。

    在nginx服务器上安装rtmp直播模块:

    1、下载nginx-rtmp-module模块

    git clone https://github.com/arut/nginx-rtmp-module.git

    如果git没有识别,通过下面命令安装git。

    yum install -y git

    2、下载nginx模块

    假设你之前已经安装好了nginx,且安装目录是/usr/local/nginx。现在在别的目录(这里是/sg)下载一个同样版本的nginx,然后解压。

    [root@localhost]# wget http://nginx.org/download/nginx-1.16.1.tar.gz

    [root@localhost]# tar -zxvf nginx-1.16.1.tar.gz

    3、 进入到解压后的nginx的目录

    ./configure --prefix=/usr/local/nginx --add-module=/sg/nginx-rtmp-module --with-http_ssl_module

    --prefix是nginx的安装目录(以前的),因为我们编译新的nginx最后要拷贝到这个目录。--add-module指定rtmp模块的路径

    4、执行make命令

    make

    make编译之后的nginx二进制文件就在objs目录下,将它覆盖你原来的nginx执行文件。

    cp /sg/nginx-1.16.1/objs/nginx  /usr/local/nginx/

    5、配置

    events {

    worker_connections  1024;

    }

    rtmp {

    server {

    listen 1935;

    chunk_size 4000;

    application hls {

    live on;

    #record all;

    #record_path /home/live_record;

    #record_max_size 200M;

    hls on;

    hls_path /root/lshTool/nginx-1.16.0/live/hls;

    hls_fragment 2s;

    #publish_notify on; #表示开启鉴权服务

    #on_publish http://127.0.0.1:80/publish; #鉴权地址

    }

    }

    }

    6、再次启动nginx即可接受手机端的rtmp推流。

    7、报错解决

    执行添加rtmp模块的时候如果报./configure: error: SSL modules require the OpenSSL library.

    执行以下命令然后继续添加rtmp模块即可

    [root@localhost]# yum -y install openssl openssl-devel

    ./configure: error: C compiler cc is not found

    执行以下命令然后继续添加rtmp模块即可

    [root@localhost]# yum install  gcc

    [root@localhost]# gcc -v

    运行效果:

    8cafdacb4925c6d50ec0b574d1acc4c8.png

    在桌面端利用rtmp播放器播放直播流:

    9c6eb9cd7bece92ad8607926c65e5539.png

    需要源码(网上也可也搜素下载)和指导的朋友可以加我QQ(395702361)。

    展开全文
  • 它使用MediaCodec系统接口对H.264和AAC进行硬编码,封装FLV格式,推送RTMP服务器。延迟达到毫秒级别。 特性列表: Android Min API 16 (Android 4.1 Jelly Bean) H.264/AAC硬编码 RTMP推流,事件...

    Yasea是一个100%纯Java写的,完全开源的安卓直播推流客户端。它使用MediaCodec系统接口对H.264和AAC进行硬编码,封装FLV格式,推送至RTMP服务器。延迟达到毫秒级别。

    特性列表:

    • Android Min API 16 (Android 4.1 Jelly Bean)

    • H.264/AAC硬编码

    • RTMP推流,事件状态回调

    • 手机横竖屏动态切换

    • 前后摄像头热切换

    • 推流过程随时录制MP4,支持暂停和恢复

    下面是yasea-master的工程源码截图:

    编译之后,生成apk,在android机器上即可安装运行。

    在nginx服务器上安装rtmp直播模块:

    1、下载nginx-rtmp-module模块

    git clone https://github.com/arut/nginx-rtmp-module.git

    如果git没有识别,通过下面命令安装git。

    yum install -y git

      2、下载nginx模块

    假设你之前已经安装好了nginx,且安装目录是/usr/local/nginx。现在在别的目录(这里是/sg)下载一个同样版本的nginx,然后解压。

    [root@localhost]# wget http://nginx.org/download/nginx-1.16.1.tar.gz

    [root@localhost]# tar -zxvf nginx-1.16.1.tar.gz

     

      3、 进入到解压后的nginx的目录

    ./configure --prefix=/usr/local/nginx --add-module=/sg/nginx-rtmp-module --with-http_ssl_module

    --prefix是nginx的安装目录(以前的),因为我们编译新的nginx最后要拷贝到这个目录。--add-module指定rtmp模块的路径

     

    4、执行make命令

    make

    make 编译之后的nginx二进制文件就在objs目录下,将它覆盖你原来的nginx执行文件。

    cp /sg/nginx-1.16.1/objs/nginx  /usr/local/nginx/

    5、配置

    events {
        worker_connections  1024;
    }
    rtmp {
        server {
            listen 1935;
            chunk_size 4000;
            application hls {
                live on;
                #record all;
                #record_path /home/live_record;
                #record_max_size 200M;
                hls on;
                hls_path /root/lshTool/nginx-1.16.0/live/hls;
                hls_fragment 2s;
                #publish_notify on; #表示开启鉴权服务
                #on_publish http://127.0.0.1:80/publish; #鉴权地址
            }
        }
    }
    

    6、再次启动nginx即可接受手机端的rtmp推流。

    7、报错解决

    执行添加rtmp模块的时候如果报 ./configure: error: SSL modules require the OpenSSL library.
    执行以下命令然后继续添加rtmp模块即可

    [root@localhost]# yum -y install openssl openssl-devel

    ./configure: error: C compiler cc is not found
    执行以下命令然后继续添加rtmp模块即可

    [root@localhost]# yum install  gcc

    [root@localhost]# gcc -v

     

    运行效果:

    在桌面端利用rtmp播放器播放直播流:

    需要源码(网上也可也搜素下载)和指导的朋友可以加我QQ(395702361)。

     

    展开全文
  • 该工具实现了一种将数据流推送到流媒体服务器上的高效方案,我们提供简洁的api供调用者使用 ,我们不仅提供了丰富的个性化接口,而且用户还可以方便的进行二次开发。 主要功能 1. 音频编码:AAC 2. 视频编码:H....
  • Android RTMP 推送 H264/AAC

    2015-10-22 13:46:56
    Android RTMP 推送 H264/AAC
  • android手机摄像头推送RTMP服务器

    热门讨论 2014-08-15 13:30:10
    -将android手机模拟为监控摄像头,推送视频流至RTMP服务器。 -不使用flash,APP工作时,本机也无需安装flash。 -兼容大部分手机,一般2.3.3以上,ARM V7架构即可。 -默认分辨率352x288,特定场合下,640x480也能...
  • 好多开发者在做对接外部编码数据推送的时候,有这样的诉求,他们希望外部的编码音视频数据,也可以同时再推送端录制下来,本文以Android平台对接外部数据为例,介绍下外部数据对接流程和数据录制流程。 ...

    背景

    好多开发者在做Android平台RTMP推送对接的同时,除了编码前的数据外,还有些外部编码数据推送诉求,他们希望外部的编码音视频数据不止可以实现RTMP推送,还可以同时在推送端实时录制下来,本文以我们(官方)Android平台RTMP直播推送模块为例,介绍下外部数据对接流程和数据录制流程。

    对接流程

    开始推送

    	private boolean StartPush()
    	{
    		if (isPushing)
    			return false;
    
    		//relayStreamUrl = "rtmp://192.168.1.77/hls/stream1";
    
    		if (relayStreamUrl == null) {
    			Log.e(TAG, "StartPush URL is null...");
    			return false;
    		}
    
    		if (!OpenPushHandle())
    			return false;
    
    		if ( libPublisher.SmartPublisherSetURL(publisherHandle, relayStreamUrl) != 0 )
    		{
    			Log.e(TAG, "StartPush failed!");
    		}
    
    		int startRet = libPublisher.SmartPublisherStartPublisher(publisherHandle);
    		if( startRet != 0)
    		{
    			Log.e(TAG, "Failed to call StartPublisher!");
    
    			if(isRTSPPublisherRunning)
    			{
    				libPublisher.SmartPublisherClose(publisherHandle);
    				publisherHandle = 0;
    			}
    
    			return false;
    		}
    
    		isPushing = true;
    
    		return true;
    	}

    OpenPushHandle()实现

    注意,如果对接外部编码后的音视频数据的话,调用SmartPublisherOpen()接口时,记得audio_opt和video_opt均传2。

    	private boolean OpenPushHandle()
    	{
    		if(publisherHandle != 0)
    		{
    			return true;
    		}
    
    		int audio_opt = 2;
    		int video_opt = 2;
    
    		int videoWidth = 640;
    		int videoHeight  = 480;
    
    		publisherHandle = libPublisher.SmartPublisherOpen(myContext, audio_opt, video_opt,
    				videoWidth, videoHeight);
    
    		if (publisherHandle == 0 )
    		{
    			Log.e(TAG, "OpenPushHandle failed!");
    			return false;
    		}
    
    		Log.i(TAG, "publisherHandle=" + publisherHandle);
    
    		libPublisher.SetSmartPublisherEventCallbackV2(publisherHandle, new EventHandePublisherV2());
    
    		return true;
    	}

    停止推送

    	public void StopPush()
    	{
    		if (!isPushing)
    			return;
    
    		isPushing = false;
    
    		libPublisher.SmartPublisherStopPublisher(publisherHandle);
    
    		if(!isRTSPPublisherRunning && !isRTSPServiceRunning)
    		{
    			libPublisher.SmartPublisherClose(publisherHandle);
    			publisherHandle = 0;
    		}
    	}

    实时音视频数据投递

    如果需要同时录制外部编码后的音视频数据,分别用以下接口完成数据投递:

    涉及到的sps、pps或者audio的一些配置信息,上层很容易拿到,传递下去即可。

    	/**
    	 * 设置编码后视频数据(H.264),如需录制编码后的数据,用此接口,且设置实际宽高
    	 *
    	 * @param codec_id, H.264对应 1
    	 *
    	 * @param data 编码后的video数据
    	 *
    	 *@param offset data的偏移
    	 *
    	 * @param size data length
    	 *
    	 * @param is_key_frame 是否I帧, if with key frame, please set 1, otherwise, set 0.
    	 *
    	 * @param timestamp video timestamp
    	 *
    	 * @param pts Presentation Time Stamp, 显示时间戳
    	 *
    	 * @param width, height: 编码后视频宽高
    	 *
    	 * @return {0} if successful
    	 */
    	public native int SmartPublisherPostVideoEncodedDataV3(long handle, int codec_id,
    														   ByteBuffer data, int offset, int size,
    														   int is_key_frame, long timestamp, long pts,
    														   byte[] sps, int sps_len,
    														   byte[] pps, int pps_len,
    														   int width, int height);
    
        /**
         * 设置音频数据(AAC/PCMA/PCMU/SPEEX)
         *
         * @param codec_id:
         *
         *  NT_MEDIA_CODEC_ID_AUDIO_BASE = 0x10000,
         *	NT_MEDIA_CODEC_ID_PCMA = NT_MEDIA_CODEC_ID_AUDIO_BASE,
         *	NT_MEDIA_CODEC_ID_PCMU,
         *	NT_MEDIA_CODEC_ID_AAC,
         *	NT_MEDIA_CODEC_ID_SPEEX,
         *	NT_MEDIA_CODEC_ID_SPEEX_NB,
         *	NT_MEDIA_CODEC_ID_SPEEX_WB,
         *	NT_MEDIA_CODEC_ID_SPEEX_UWB,
         *
         * @param data audio数据
         *
         * @param offset data的偏移
         *
         * @param size data length
         *
         * @param is_key_frame 是否I帧, if with key frame, please set 1, otherwise, set 0, audio忽略
         *
         * @param timestamp video timestamp
         *
         * @param parameter_info 用于AAC special config信息填充
         *
         * @param parameter_info_size parameter info size
         *
         * @param sample_rate 采样率,如果需要录像的话必须传正确的值
         *
         *@param channels 通道数, 如果需要录像的话必须传正确的值, 一般是1或者2
         *
         * @return {0} if successful
         */
        public native int SmartPublisherPostAudioEncodedDataV3(long handle, int codec_id,
                                                               ByteBuffer data, int offset, int size,
                                                               int is_key_frame, long timestamp,
                                                               byte[] parameter_info, int parameter_info_size,
                                                               int sample_rate, int channels);

    开始录像

    	private boolean StartRecorder()
    	{
    		if (!OpenPullHandle())
    			return false;
    
    		ConfigRecorderFuntion();
    
    		int iRecRet = libPlayer
    				.SmartPlayerStartRecorder(playerHandle);
    
    		if (iRecRet != 0) {
    			Log.e(TAG, "StartRecorder failed!");
    
    			if ( !isPulling &&!isPlaying && !isPushing && !isRTSPPublisherRunning)
    			{
    				libPlayer.SmartPlayerClose(playerHandle);
    				playerHandle = 0;
    			}
    
    			return false;
    		}
    
    		isRecording = true;
    		return true;
    	}

    停止录像

    	private void StopRecorder()
    	{
    		if ( !isRecording )
    			return;
    
    		isRecording = false;
    
    		libPlayer.SmartPlayerStopRecorder(playerHandle);
    
    		if ( !isPlaying && !isPulling && !isPushing && !isRTSPPublisherRunning)
    		{
    			libPlayer.SmartPlayerClose(playerHandle);
    			playerHandle = 0;
    		}
    	}

    总结

    外部数据对接的话,需要确保传递的音视频数据编码信息正常,相关的时间戳能对得上,从而确保好的用户体验。

    展开全文
  • Android 推送手机音频数据到RTMP服务器 AACtoRTMP
  • Android手机屏幕RTMP推流工具是一款可以将安卓手机屏幕上的任何内容推送到任意一款rtmp服务器上的工具,不仅可以分享手机屏幕内容,还可以分享手机上正在播放的视频、正在捕获的相机内容、其它APP正在播放的视频等...
  • 多路编码,多个实例分别推送到不同的RTMP URL(如Android采集板卡同时接2路出去); 同一路编码,多个实例分别推送到不同的RTMP URL(如推送到内网、外网不同的RTMP服务器); 部分路编码、部分路对接编码后的H.264/...
  • Android rtmp 视频流采集推送;更多可关注:http://blog.csdn.net/yqw2007/article/details/43273259
  • 随着无纸化、智慧教室等场景的普及,好多企业或者开发者开始寻求更高效稳定低延迟的RTMP同屏方案,本文以大牛直播SDK(Github)的同屏demo(对应工程:SmartServicePublisherV2)为例,介绍下如何采集编码推送RTMP数据...
  • 像Unity3D下的RTMP或RTSP播放器...下图系Android平台Unity环境下采集屏幕,编码推送RTMP服务器,然后Windows平台播放器拉取RTMP流播放,为了方便看到延迟效果,特地在Android端的Unity窗口显示了当前时间,可以看到
  • 附带Nginx服务器搭建文档和flv分析器,详细博客内容链接:https://blog.csdn.net/wozuihaole/article/details/107838147
  • 好多开发者在调用Android平台RTMP推送或轻量级RTSP服务接口时,采集到的video数据类型多样化,如420sp、I420、yv12、nv21、rgb的,还有的拿到的图像是倒置的,如果开发者在上层转换后,传到底层编码处理,无疑加大了...
  • 背景分析 RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMP/RTMPS/RTMPE等多种变种。...RTMP推流,就是将直播内容推送到服...
  • 由于项目一直在忙,刚抽出空来,在这期间身体有些不适,这段时间中有一段时间感觉自己有上班恐惧症,一到工作环境中,不自然的...言归正传,这里记录一下在开发Android NDK模式下使用FFempg开发音视频解码和转流功能。
  • 附带Nginx服务器搭建文档和flv分析器,详细博客内容链接:https://blog.csdn.net/wozuihaole/article/details/107838147
  • 编码与推送 EasyPusher支持硬编码和软编码.硬编码用MediaCodec来实现的,软编码用X264编码库实现的.分别对应类HWConsumer和SWConsumer. 硬编码的初始化 在startPreview时,调用硬编码的onVideoStart回调,这里...
  • rtmpANE可以将Flash(air)场景内的任意元件、摄像头或整个场景编码为h264格式的视频,麦克风的原始pcm数据编码为aac音频,然后将音视频混流rtmp服务器。目前有Windows一个版本,将来会出Android版本或者...
  • “三网融合”已成趋势。 网络电视直播在**业大力鼓起,各**媒体、新闻媒体都逐渐开始树立自个的网络电视直播体系。... 今天给大家介绍通过洋铭 NVS-25 网络编码器采集电视信号推送标准的RTMP流到...
  • Android摄像头RTMP推

    热门讨论 2016-03-01 12:05:40
    使用FFMPEG的RTMP推流修改而来,可以读取摄像头和音频流至流媒体服务器,适合做视频直播的新手参考.
  • 好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了。 不解释,以Android平台RTMP推送模块常用接口,看看这些接口有没有存在的意义...
  • 背景分析 RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMP/RTMPS/RTMPE等多种变种。...RTMP推流,就是将直播内容推送到服...
  • 原标题:实现手机直播屏幕推送及录像的RTMP推流组件EasyRTMP-Android使用H265编码流程RTMP推流组件EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer)、智能丢帧、...
  • 好多开发者在调用Android平台RTMP推送或轻量级RTSP服务接口时,采集到的video数据类型多样化,如420sp、I420、yv12、nv21、rgb的,还有的拿到的图像是倒置的,如果开发者在上层转换后,传到底层编码处理,无疑加大了...
  • EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、arm(hisiv100/hisiv200/hisiv300/...
  • 这两天在学习研究ffmpeg,在“ 最简单的基于FFmpeg的推流器(以推送RTMP为例) ” 遇到几个问题,把解决方法分享一下。 首先附上链接 博文链接 http://blog.csdn.net/leixiaohua1020/article/details/39803457  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,637
精华内容 1,054
关键字:

android推送rtmp