vlc-android截屏以及录像功能的实现

这里讲的是vlc-android截屏以及录像功能的实现,如果单纯想编译vlc-android的源码请移步至:http://blog.csdn.net/a358763471/article/details/38331121

1、首先按照上面编译文档的流程配置好ubuntu下的android环境

2、安装好一大堆工具:

          sudo apt-get install ant autoconf automake autopoint cmake gawk gcc g++ libtool m4 patch pkg-config ragel subversion yasm git
切换vlc android 版本到 0.1.x-bugfix(这一步不要忘记,一开始忘记了导致重新下了一次源码
           git clone git://git.videolan.org/vlc-ports/android.git
           cd android
           git branch -r
           git checkout 0.1.x-bugfix
3、修改部分文件:
1)android/configure.sh进行修改 删掉其中的-disable-sout
2) 另外保存图片为png格式,需要让ffmpeg增加-enable-encoder=png的编码器(在android/vlc/contrib/src/ffmpeg/rules.mak中修改)
    有一行:
else

FFMPEGCONF += --disable-encoders --disable-muxers

 改成FFMPEGCONF += --disable-encoders --enable-encoder=png --disable-muxers
4、编译源码:直接在android目录执行 sh compile.sh
编译过程中不知道为啥遇到好几次停顿,每次都是touch **;反正不是报错,没管它继续重新执行sh compile.sh。
最后报错了:../vlc/android/modules/.libs/libvorbis_plugin.a(libvorbis_plugin_la-vorbis.o): in function OpenEncoder:../../modules/codec/vorbis.c:758: error: undefined reference to 'vorbis_encode_setup_vbr
解决办法:将下面的红色部分修改
修改vlc-android/jni/Android.mk
  1. LOCAL_LDLIBS := -L$(VLC_CONTRIB)/lib \  
  2. $(VLC_MODULES) \  
  3. $(VLC_BUILD_DIR)/lib/.libs/libvlc.a \  
  4. $(VLC_BUILD_DIR)/src/.libs/libvlccore.a \  
  5. $(VLC_BUILD_DIR)/compat/.libs/libcompat.a \  
  6. -ldl -lz -lm -llog \  
  7. -ldvbpsi -lebml -lmatroska -ltag \  
  8. -logg -lFLAC -ltheora -lvorbis -lvorbisfile -lvorbisenc \  
  9. -lmpeg2 -la52 \  
  10. -lavformat -lavcodec -lswscale -lavutil -lpostproc -lgsm -lopenjpeg \  
  11. -lliveMedia -lUsageEnvironment -lBasicUsageEnvironment -lgroupsock \  
  12. -lspeex -lspeexdsp \  
  13. -lxml2 -lpng -lgnutls -lgcrypt -lgpg-error \  
  14. -lnettle -lhogweed -lgmp \  
  15. -lfreetype -liconv -lass -lfribidi -lopus \  
  16. -lEGL -lGLESv2 -ljpeg \  
  17. $(CPP_STATIC)  
-logg -lFLAC -ltheora -lvorbis 
后添加
-lvorbisfile -lvorbisenc 

继续编译,结果有报错了:
error: undefined reference to 'vlc_entry__access_output_udp'

出现这个错误,修改一下/vlc/modules/access_output目录下的
Modules.am 文件就可以编译过了。
修改方法:将下面的红色部分修改(晕死,红色都加不上,加上代码就变了,大家自己对比哪里不同吧,添加了两行,注释了三行)
  1. SOURCES_access_output_dummy = dummy.c  
  2. SOURCES_access_output_file = file.c  
  3. SOURCES_access_output_udp = udp.c  
  4. SOURCES_access_output_http = http.c bonjour.c bonjour.h  
  5. SOURCES_access_output_shout = shout.c  
  6.   
  7.   
  8. access_output_LTLIBRARIES += \  
  9.     libaccess_output_dummy_plugin.la \  
  10.     libaccess_output_file_plugin.la \  
  11.     libaccess_output_udp_plugin.la \  
  12.     libaccess_output_http_plugin.la  
  13.   
  14.   
  15. #libaccess_output_udp_plugin_la_SOURCES = udp.c  
  16. #libaccess_output_udp_plugin_la_LIBADD = $(SOCKET_LIBS) $(LIBPTHREAD)  
  17. #access_output_LTLIBRARIES += libaccess_output_udp_plugin.la  
  18.   
  19.   
  20. libaccess_output_livehttp_plugin_la_SOURCES = livehttp.c  
  21. libaccess_output_livehttp_plugin_la_CFLAGS = $(AM_CFLAGS) $(GCRYPT_CFLAGS)  
  22. libaccess_output_livehttp_plugin_la_LIBADD = $(GCRYPT_LIBS) -lgpg-error  
  23. if HAVE_GCRYPT  
  24. access_output_LTLIBRARIES += libaccess_output_livehttp_plugin.la  
  25. endif  


ok,到这里问题解决可以成功编译源码了。最后的库文件在vlc-android/libs/arm**中
5、添加截屏以及录像功能代码(这一步可以在第四步编译的时候就加上):
8月1日更新
   其实需要修改的文件不只是下面这两个,最好能够看懂patch文件,自行添加patch包,也就是打补丁。
   文件的大概内容请看:https://patches.videolan.org/patch/606/
8月1日更新结束
1)修改vlc/include/vlc/libvlc_media_player.h,在文件最后两行:
/** @} audio */
/** @} media_player */
之间添加代码:
  1. LIBVLC_API bool libvlc_media_player_is_recordable( libvlc_media_player_t *p_mi );  
  2.   
  3. LIBVLC_API bool libvlc_media_player_is_recording( libvlc_media_player_t *p_mi );  
  4.   
  5. LIBVLC_API int libvlc_media_player_record_start( libvlc_media_player_t *p_mi, const char *psz_filename );  
  6.   
  7. LIBVLC_API int libvlc_media_player_record_stop( libvlc_media_player_t *p_mi );  
2)在vlc/lib/media_player.c最后添加:
  1. bool libvlc_media_player_is_recordable( libvlc_media_player_t *p_mi )  
  2. {  
  3.     input_thread_t *p_input_thread;  
  4.     bool b_can_record;  
  5.   
  6.     p_input_thread = libvlc_get_input_thread( p_mi );  
  7.     if( !p_input_thread )  
  8.         return false;  
  9.   
  10.     b_can_record = var_GetBool( p_input_thread, "can-record" );  
  11.   
  12.     vlc_object_release( p_input_thread );  
  13.     return b_can_record;  
  14. }  
  15. bool libvlc_media_player_is_recording( libvlc_media_player_t *p_mi )  
  16. {  
  17.     input_thread_t *p_input_thread;  
  18.     bool b_record;  
  19.   
  20.     p_input_thread = libvlc_get_input_thread( p_mi );  
  21.     if( !p_input_thread )  
  22.         return false;  
  23.   
  24.     b_record = var_GetBool( p_input_thread, "record" );  
  25.   
  26.     vlc_object_release( p_input_thread );  
  27.     return b_record;  
  28. }  
  29. int libvlc_media_player_record_start( libvlc_media_player_t *p_mi, const char* psz_filename )  
  30. {  
  31.     input_thread_t *p_input_thread;  
  32.   
  33.     p_input_thread = libvlc_get_input_thread( p_mi );  
  34.     if( !p_input_thread )  
  35.         return -1;  
  36.   
  37.     var_SetString( p_input_thread, "input-record-path", psz_filename );  
  38.     var_SetBool( p_input_thread, "record"true );  
  39.   
  40.     vlc_object_release( p_input_thread );  
  41.     return 0;  
  42. }  
  43. int libvlc_media_player_record_stop( libvlc_media_player_t *p_mi )  
  44. {  
  45.     input_thread_t *p_input_thread;  
  46.   
  47.     p_input_thread = libvlc_get_input_thread( p_mi );  
  48.     if( !p_input_thread )  
  49.         return -1;  
  50.   
  51.     var_SetBool( p_input_thread, "record"false );  
  52.   
  53.     vlc_object_release( p_input_thread );  
  54.     return 0;  
  55. }  
,ok修改完毕,重新sh compile.sh
3)在LibVLC.java中添加:
  1. public native boolean takeSnapShot( int num, String file, int width, int height);  
  2.       
  3.     public native boolean videoRecordStart(String path);  
  4.       
  5.     public native boolean videoRecordStop();  
  6.       
  7.     public native boolean videoIsRecording();  
  8.       
  9.     public native boolean videoIsRecordable();  
  10.       
  11.     public native int getState();  
  12.       
  13.     public boolean takeSnapShot(String file, int width, int height) {  
  14.         return takeSnapShot(0, file, width, height);  
  15.     }  

即可调用java接口takeSnapShot实现截屏功能了,录像功能的接口:viceoRecordStart,videoRecordStop。
很快就可以编译出最新的库文件。到这里便实现了截屏跟录像的功能。给一个最后截屏跟录像的实例吧:
下载链接:费了老大劲才传上去,注意下载后源码要自己修改成适合自己的url,(这里测试的是rtsp的)http://download.csdn.net/detail/a358763471/7702397
本文参考文章:
http://blog.csdn.net/vertx/article/details/8559385#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值