‘壹’ android如何播放RTMP协议视频流
Adboe的Red5流媒体服务器免费并且是开源的,与Flash搭配的时候可谓是天生一对,但使用java和Android作为客户端调用却可谓一波三折。
Adobe的Red5源代码里有一个RTMPClient的类,这个类在使用上其实不复杂,但却没办法成功调用。观察日志,发现是连接成功后在开始创建流的时候,服务端把连接断开了。我能想到的解释就是可能公司现在所使用的Red5服务器的版本与这个RTMPClient不兼容。
‘贰’ android ffmpeg 是啥意思
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
用来开发音视频的~!
‘叁’ 有没有ffmpeg 开发的android demo求一例
转载 首先:
是要编译libjnivideo.so和libjniaudio.so 这两个so因为不同的版本或者修改过的framework是不一样的,所以需要在android源码中 编译出自己的so。我的android 2.1源码是从官网下载回来的,没有经过修改。
下载链接中的native目录下的源码到framework/base目录下具体看他的目录结构。https://github:com/havlenapetr/android_frameworks_base编译主要有3个错误
1.
library 'libjnigraphics.so' not in prelink map
当前目录下的Android.mk 加上
LOCAL_PRELINK_MODULE := false2.
frameworks/base/native/video/jni/surface.cpp:17:36: error: surfaceflinger/Surface.h: No such file or directory
修改头文件
#include <android/surface.h>
#include <ui/Surface.h>
#include <utils/Log.h>
#include <SkBitmap.h>
#include <SkCanvas.h>3.
make: *** 没有规则可以创建“out/target/proct/generic/obj/SHARED_LIBRARIES/libjnivideo_intermediates/LINKED/libjnivideo.so”需要的目标“out/target/proct/generic/obj/lib/libsurfaceflinger_client.so”。 停止。
当前目录下的Android.mk
LOCAL_SHARED_LIBRARIES := /
libskia /
libui /
libutils /
liblog
到这里如果幸运的话可以编译出so。其次是编译libffmpeg_jni.so
需要修改的地方:
1.
jni/jni/Android.mkLOCAL_C_INCLUDES += /
$(LOCAL_PATH)/../libffmpeg /
$(LOCAL_PATH)/../libmediaplayer /
$(LOCAL_PATH)/../include /
$(LOCAL_PATH)/../include/androidifeq ($(IN_NDK),true)
LOCAL_LDLIBS := -llog
else
LOCAL_PRELINK_MODULE := false
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := liblog
endif
2.
Vector.h#include <new>
#include <stdint.h>
#include <sys/types.h>#include <cutils/log.h>
#include <utils/VectorImpl.h>
#include <utils/TypeHelpers.h>
#include <android/Errors.h>
3.
<utils/TypeHelpers.h>4
VectorImpl.h#include <assert.h>
#include <stdint.h>
#include <sys/types.h>
#include <android/Errors.h>5.
VectorImpl.cpp
#include <string.h>
#include <stdlib.h>
#include <stdio.h>#include <cutils/log.h>
#include <android/Errors.h>
#include <utils/SharedBuffer.h>
#include <utils/VectorImpl.h>
同时也要把刚才两个编译出来的so放到obj/local/armeabi目录下,之后就可以了编译出libffmpeg_jni.so.
最后也要把刚才两个so放到libs/armeabi目录下。要不然运行的时候找不到。
播放的时候太卡了,声音也没有同步。
‘肆’ 如何用Android NDK编译FFmpeg
如何使用ndk为ffmpeg编译rtmp+polarssl静态库?这个问题花了我整整一天时间。其中遇到很多小问题,这里记录一下,方便自己也方便其他人。1、编译polarssl,查看其Readme文件即可,不需要configure,只需要make时带上必要的参数即可,不过要记得在每一次执行make命令时都带上CC的参数(指向你的armgcc),因为我试过在makeinstall时没有带上CC的参数,虽然能编译出polarssl但是未能正确被rtmp引用到。2、因为前面我用的polarssl是当前最新(1.3.7)版本,而librtmp使用的好像是polarssl1.0.0以下版本的api,所以需要修改rtmp部分源码,让其调用新版polarssl的api,这里的修改可以参照《MigratingfromPolarSSL-1.2tothePolarSSL1.3branch》和《[rtmpmp]branchmasterupdated.a312ac7FixcompatwithPolarSSL>=1.1.0》。3、出现undefinedreferenceto`havege_random’错误,这里是因为polarssl默认关闭了havege模块,需要你手动开启,主要就是修改include/polarssl/config.h,去掉POLARSSL_HAVEGE_C前的注释,也就是要定义POLARSSL_HAVEGE_C,如下:#definePOLARSSL_HAVEGE_C4、在编译出上面两个库之后,可以开始编译ffmpeg(2.1.1版本)了,如果遇到下面的问题check_pkg_configlibrtmplibrtmp/rtmp.hRTMP_SocketERROR:librtmpnotfound这里有三种解决方法:第一种,因为是网络上传播最多的,算是比较简便的方法,就是修改ffmpeg的configure,将以下一行:enabledlibrtmp&&require_pkg_configlibrtmplibrtmp/rtmp.hRTMP_Socket改为:enabledlibrtmp&&requirelibrtmplibrtmp/rtmp.hRTMP_Socket-lrtmp-lpolarssl-lz或者直接注释掉&&***部分,然后再自己加上librtmp的库路径也行第二种,(比较推荐,因为解决了这个会顺带解决大部分找不到库的错误!)因为这里使用了pkg-config工具查找库,而这个工具ndk并没有附带提供,而出现check_pkg_config相关错误的话,只要稍加注意,会发现在使用configure配置ffmpeg的交叉编译时,已经有相应的pkg-config不存在的警告了。我对这个工具不熟悉,所以我只是简单地加上了一个软链接到系统的pkg-config,如下:ln-s/usr/bin/pkg-config/home/cidy0106/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config这个时候重新configure的话可能会出现找不到polarssl库的错误提示,需要修改一下librtmp安装目录里的librtmp.pc,把以下内容:Libs:-L${libdir}-lrtmp-lz改为:Libs:-L${libdir}-lrtmp-lz-lpolarssl至此,就可以正确编译出ffmpeg了转载
‘伍’ android系统播放rtmp直播流
建议网络下ffmpeg这个,可以解决android下各种格式视频流播放
‘陆’ android rtmp推流怎么实现
就拿使用ZEGO即构的实时音视频产品举个例子,要想实现android rtmp推流操作,可以通过调用开始推流 startPublishingStream 的 API 接口,向远端用户发送本端的音视频流。如果不需要继续推流,可调用 stopPublishingStream 停止推流(开始推流前,建议开发者在开始推流前对推流参数、本地预览视图进行设置)。
‘柒’ 如何在Android用FFmpeg解码图像
在Android用FFmpeg解码图像
for(i=0;i<pFormatCtx->nb_streams;i++)if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){videoStream=i;break;}if(videoStream==-1)return-1;//Didn'tfindavideostream//=pFormatCtx->streams[videoStream]->codec;//=avcodec_find_decoder(pCodecCtx->codec_id);if(pCodec==NULL){fprintf(stderr,"Unsupportedcodec! ");return-1;//Codecnotfound}//Opencodecif(avcodec_open2(pCodecCtx,pCodec,NULL)<0)pFrame=avcodec_alloc_frame();//_alloc(&picture,PIX_FMT_RGB24,pCodecCtx->width,pCodecCtx->height);//_convert_ctx=sws_getContext(pCodecCtx->width,pCodecCtx->height,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height,PIX_FMT_RGB24,SWS_BICUBIC,NULL,NULL,NULL);if(img_convert_ctx==NULL){fprintf(stderr,"! ");exit(1);}///*########################################[4]########################################*/i=0;dirtyRegion.set(android::Rect(0x3FFF,0x3FFF));while(av_read_frame(pFormatCtx,&packet)>=0){//?if(packet.stream_index==videoStream){//Decodevideoframeavcodec_decode_video2(pCodecCtx,pFrame,&frameFinished,&packet);//Didwegetavideoframe?if(frameFinished){//_scale(img_convert_ctx,pFrame->data,pFrame->linesize,0,pCodecCtx->height,picture.data,picture.linesize);}}//_read_frameav_free_packet(&packet);}pFrame为解码后的数据,将它显示在画布上,就完成了FFMEPG解码
‘捌’ ffmpeg里的ffserver怎么支持rtmp呢,没搞出来
ffmpeg本身实现了rtmp协议的解析,具体可以查看源代码,只是性能不如librtmp强,并且不支持rtmpt,rtmps等
‘玖’ FFMPEG推送rtmp源实例怎么解决
如果要单纯的以h.264的码流推送摄像头的视频到rtmp server(ip:127.0.0.1),可以这样: ffmpeg -f video4linux2 -vcodec libx264 -vpre default -s320x240 -i /dev/video0 -f flv rtmp://127.0.0.1:1935/app/stream