『壹』 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