环境部署


2015年开始直播变得越来越流行,很多的直播平台也应运而生,直播是一个很有技术的项目,从服务端到客户端到web等等。我们将写一序列的博客来阐述直播中的技术,这包括服务端技术和客户端技术。包括最简单的服务端环境部署、客户端编译、采集、推流、拉流、美化特效、水印、延时优化、音视频同步、p2p等等。当然还可能包括一些信号处理的知识,比如滤波,傅里叶变换(FFT)。从本文开始我们将从环境部署开始,这包括两方面的环境部署即服务端和客户端。

1、服务端


在部署服务端环境其实包含很多东西的,最常用的web服务nginx,数据库MySQL、Nosql,api开发最多的三种选择:

  • java环境,需要jdk,tomcat/jboss
  • php环境,需要安装php,odp
  • lua环境,需要安装lua、luajit

考虑使用缓存技术,则主要包含redis和memcached。如果还要其他的日志统计(kafka什么的)需求则还需要更多的环境,我们这里不讨论,只是简单叙述
对于直播而言,我们需要部署两个东西,nginx(含nginx-rtmp-module)、ffmpeg,这两个是直播服务端的关键,下面我们简单讲述如何安装nginx(含nginx-rtmp-module)和ffmpeg以及如何配置nginx.conf。
首选我们来安装nginx和ffmpeg。
nginx下载地址:

  • 官方release:http://nginx.org/en/download.html
  • gitHub地址:https://github.com/nginx/nginx

ffmpeg下载地址:

  • 官方release:https://ffmpeg.org/download.html
  • gitHub地址:https://github.com/FFmpeg/FFmpeg

nginx-rtmp-module下载地址:https://github.com/arut/nginx-rtmp-module

其中nginx-rtmp-module是Google工程师开发的,在gitHub上有很多分支,根据自己的需求选择分支,我们这里选择master分支。
首选安装nginx和nginx-rtmp-module,在安装nginx的时候,会需要openssl、pcre、zlib这几个库。cd 进入nginx解压目录

<code class="hljs lasso has-numbering"><span class="hljs-built_in">.</span>/configure <span class="hljs-subst">--</span>prefix<span class="hljs-subst">=</span>/usr/<span class="hljs-built_in">local</span>/nginx <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-pcre</span><span class="hljs-subst">=</span>/path/<span class="hljs-keyword">to</span>/your/pcre<span class="hljs-subst">/</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-zlib</span><span class="hljs-subst">=</span>/path/<span class="hljs-keyword">to</span>/your/zlib<span class="hljs-subst">/</span> <span class="hljs-subst">--</span><span class="hljs-keyword">with</span><span class="hljs-attribute">-openssl</span><span class="hljs-subst">=</span>/path/<span class="hljs-keyword">to</span>/your/openssl<span class="hljs-subst">/</span>  <span class="hljs-subst">--</span>add<span class="hljs-attribute">-module</span><span class="hljs-subst">=</span>/path/<span class="hljs-keyword">to</span>/your/nginx<span class="hljs-attribute">-rtmp</span><span class="hljs-attribute">-module</span>  </code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

其中–prefix是指安装后nginx的目录,–with-pcre需要pcre库,/path/to/your/pcre/是指的pcre源代码路径,其他的同理。–add-module=/path/to/your/nginx-rtmp-module 这个是添加nginx-rtmp-module,将nginx-rtmp-module嵌入到nginx中,这样是nginx的强大之处-插件功能。
安装完成之后,在浏览器中输入localhost:8080则会出现如下画面:

那么接下安装ffmpeg,解压ffmpeg并cd进去目录,执以下语句

<code class="hljs brainfuck has-numbering"><span class="hljs-string">.</span><span class="hljs-comment">/configure</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">enable</span><span class="hljs-literal">-</span><span class="hljs-comment">shared</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">prefix=/usr/local/ffmpeg</span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

网上有很多安装ffmpeg的教程,这里不详细介绍。
如果安装成功后会,在终端中输入 ffmpeg -version会显示相关的信息。如果没有则可能没有安装成功。
安装完成之后我们来看看nginx.conf的配置信息。

<code class="hljs applescript has-numbering">worker_processes  <span class="hljs-number">2</span>;error_log  logs/<span class="hljs-keyword">error</span>.<span class="hljs-command">log</span>;
error_log  logs/<span class="hljs-keyword">error</span>.<span class="hljs-command">log</span>  notice;
error_log  logs/<span class="hljs-keyword">error</span>.<span class="hljs-command">log</span>  info;pid        logs/nginx.pid;events {worker_connections  <span class="hljs-number">128</span>;
}http {include       mime.types;default_type  <span class="hljs-type">application</span>/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] <span class="hljs-string">"$request"</span> ''$status $body_bytes_sent <span class="hljs-string">"$http_referer"</span> ''<span class="hljs-string">"$http_user_agent"</span> <span class="hljs-string">"$http_x_forwarded_for"</span>';access_log  logs/access.<span class="hljs-command">log</span>  main;sendfile        <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;keepalive_timeout  <span class="hljs-number">65</span>;server_names_hash_bucket_size <span class="hljs-number">128</span>;client_header_buffer_size <span class="hljs-number">32</span>k;large_client_header_buffers <span class="hljs-number">4</span> <span class="hljs-number">32</span>k;client_max_body_size <span class="hljs-number">300</span>m;tcp_nopush     <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;tcp_nodelay <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;server_tokens off;gzip  <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;gzip_min_length  <span class="hljs-number">1</span>k;gzip_buffers     <span class="hljs-number">4</span> <span class="hljs-number">16</span>k;gzip_http_version <span class="hljs-number">1.1</span>;gzip_comp_level <span class="hljs-number">2</span>;gzip_types     <span class="hljs-type">text</span>/plain <span class="hljs-type">application</span>/x-javascript <span class="hljs-type">text</span>/css <span class="hljs-type">application</span>/xml;gzip_vary <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;include vhosts/*.conf;}<span class="hljs-comment">#切换自动推送(多 worker 直播流)模式。默认为 off</span>
<span class="hljs-comment">#rtmp_auto_push on;</span><span class="hljs-comment">#当 worker 被干掉时设置自动推送连接超时时间。默认为 100 毫秒</span>
<span class="hljs-comment">#rtmp_auto_push_reconnect 1s;</span><span class="hljs-comment">#设置用于流推送的 UNIX 域套接字目录。默认为 /tmp</span>
<span class="hljs-comment">#rtmp_socket_dir /var/sock;</span>
rtmp {server {listen <span class="hljs-number">1935</span>;<span class="hljs-comment">#点播配置</span><span class="hljs-comment">#application vod {</span><span class="hljs-comment">#    play /opt/media/nginxrtmp/flv;</span><span class="hljs-comment">#}</span><span class="hljs-comment">#直播流配置</span><span class="hljs-type">application</span> live {live <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;<span class="hljs-comment">#allow publish 127.0.0.1;</span><span class="hljs-comment">#deny publish all;</span><span class="hljs-comment">#allow play all;</span>}<span class="hljs-comment">#access_log logs/rtmp_access.log new;</span>access_log logs/rtmp_access.<span class="hljs-command">log</span>;access_log <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>;<span class="hljs-comment">#HLS协议支持</span><span class="hljs-comment">#application hls {</span><span class="hljs-comment">#live on;</span><span class="hljs-comment">#hls on;</span><span class="hljs-comment">#hls_path /tmp/app;</span><span class="hljs-comment">#hls_fragment 5s;</span><span class="hljs-comment">#}</span><span class="hljs-comment">#application hls{</span><span class="hljs-comment">#   live on;</span><span class="hljs-comment">#   hls on;</span><span class="hljs-comment">#   hls_path /usr/local/Cellar/nginx-full/1.10.1/html/app;</span><span class="hljs-comment">#   hls_fragment 1s;</span><span class="hljs-comment">#}</span>}}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li></ul>

其中http相关的标签我这边不做详细的介绍,这个等一会用到api的时候详细介绍。下面我们看看rtmp标签,rtmp标签的意思是声明一个 RTMP 实例。在rtmp标签下面有server,它的意思是给 NGINX 添加一个监听端口以接收 RTMP 连接
application标签是创建一个 RTMP 应用。application 名的模式并不类似于 http location。这个以后再详细阐述。在这个配置中,我们只是配置了一个live,同时打开了log,其他的相关的参数我们现在不说明,等以后会专门介绍rtmp的配置文章介绍。
配置好了这个之后就是通过ffmpeg向server推流。ffmpeg的指令为:

<code class="hljs lasso has-numbering">ffmpeg <span class="hljs-attribute">-re</span> <span class="hljs-attribute">-i</span> /Users/jarlene/Downloads/test<span class="hljs-built_in">.</span>flv <span class="hljs-attribute">-c</span> copy <span class="hljs-attribute">-f</span> flv rtmp:<span class="hljs-comment">//localhost:1935/live/steam</span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

这里不详细介绍ffmpeg指令,因为接下来我们会有一篇专门的文章接受ffmpeg。
这个时候就可以用vlc播放器拉流看直播了。

到这里我们就简单讲述了nginx和ffmpeg安装和nginx.conf配置信息以及推流和观看

2、客户端


相对于服务端环境部署来说客户端环境部署复杂很多,尤其是在Android平台,编译导入android studio等等过程都很复杂,ios平台还好,但是由于我个人喜爱,在此也会加上Windows客户端相配置,只不过windows会一段时间后更新。对于客户端主要就是编译ffmpeg。下面这段脚本是编译ffmpeg到android和ios平台的。

<code class="hljs bash has-numbering"><span class="hljs-comment">#/bin/bash</span>
AndroidDest=`<span class="hljs-built_in">pwd</span>`/FFmpeg-Android && rm -rf <span class="hljs-variable">$AndroidDest</span>
IOSDest=`<span class="hljs-built_in">pwd</span>`/FFmpeg-iOS && rm -rf <span class="hljs-variable">$IOSDest</span>
SOURCE=<span class="hljs-string">"ffmpeg-3.1.1"</span>
THIN=<span class="hljs-string">"<span class="hljs-variable">$IOSDest</span>/thin"</span>
SCRATCH=<span class="hljs-string">"<span class="hljs-variable">$IOSDest</span>/scratch"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$THIN</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$SCRATCH</span><span class="hljs-comment"># if [ -d ffmpeg ]; then</span>
<span class="hljs-comment">#   cd ffmpeg</span>
<span class="hljs-comment"># else</span>
<span class="hljs-comment">#   git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg</span>
<span class="hljs-comment">#   cd ffmpeg</span>
<span class="hljs-comment"># fi</span>
<span class="hljs-keyword">if</span> [ ! -r <span class="hljs-variable">$SOURCE</span> ]<span class="hljs-keyword">then</span><span class="hljs-built_in">echo</span> <span class="hljs-string">'FFmpeg source not found. Trying to download...'</span>curl http://www.ffmpeg.org/releases/<span class="hljs-variable">$SOURCE</span>.tar.bz2 | tar xj \|| <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">fi</span>function <span class="hljs-function"><span class="hljs-title">android</span></span>()
{<span class="hljs-built_in">cd</span> <span class="hljs-variable">$SOURCE</span><span class="hljs-comment"># sed -i -e 's|SLIBNAME_WITH_MAJOR='\$(SLIBNAME).\$(LIBMAJOR)'|SLIBNAME_WITH_MAJOR='\$(SLIBPREF)\$(FULLNAME)-\$(LIBMAJOR)\$(SLIBSUF)'|' configure</span><span class="hljs-comment"># sed -i -e 's|LIB_INSTALL_EXTRA_CMD='\$\$(RANLIB)"\$(LIBDIR)/\$(LIBNAME)"'|LIB_INSTALL_EXTRA_CMD='\$\$(RANLIB)"\$(LIBDIR)/\$(LIBNAME)"'|' configure</span><span class="hljs-comment"># sed -i -e 's|SLIB_INSTALL_LINKS='\$(SLIBNAME_WITH_MAJOR)\$(SLIBNAME)'|SLIB_INSTALL_LINKS='\$(SLIBNAME)'|' configure</span>NDK=/Users/jarlene/Library/Android/sdk/ndk-bundleSYSROOT=<span class="hljs-variable">$NDK</span>/platforms/android-<span class="hljs-number">19</span>/arch-armWORKING_DIR=`<span class="hljs-built_in">pwd</span>`<span class="hljs-comment"># Expand the prebuilt/* path into the correct one</span>TOOLCHAIN=`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$NDK</span>/toolchains/arm-linux-androideabi-<span class="hljs-number">4.9</span>/prebuilt/darwin-x86_64`<span class="hljs-keyword">export</span> PATH=<span class="hljs-variable">$TOOLCHAIN</span>/bin:<span class="hljs-variable">$PATH</span><span class="hljs-comment"># Don't build any neon version for now</span><span class="hljs-keyword">for</span> version <span class="hljs-keyword">in</span> armv5te armv7a; <span class="hljs-keyword">do</span>DEST=<span class="hljs-variable">$AndroidDest</span>FLAGS=<span class="hljs-string">"--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --sysroot=<span class="hljs-variable">$SYSROOT</span>"</span><span class="hljs-comment">#FLAGS="$FLAGS --soname-prefix=/data/data/net.sourceforge.servestream/lib/"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --enable-shared --disable-symver"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-small --optimization-flags=-O2"</span><span class="hljs-comment">#FLAGS="$FLAGS --extra-cflags=-I$NDK/platforms/android-23/arch-arm/usr/include/ffmpeg --extra-ldflags=-L$NDK/platforms/android-23/arch-arm/usr/lib"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --disable-doc"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-gpl"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --disable-ffmpeg"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --disable-ffplay"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --disable-ffprobe"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --disable-ffserver"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-avdevice"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-swresample"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-swscale"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --enable-postproc"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-avfilter"</span><span class="hljs-comment"># FLAGS="$FLAGS --disable-everything"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-muxer=mov --enable-muxer=ipod --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi "</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-demuxer=acc,flac,h263,h264,m4v,matroska,mp3,mpegvideo,ogg,pcm_alaw,pcm_f32be,pcm_f32le,pcm_f64be,pcm_f64le,pcm_mulaw,pcm_s16be,pcm_s16le,pcm_s24be"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-demuxer=pcm_s24le,pcm_s32be,pcm_s32le,pcm_s8,pcm_u16be,pcm_u16le,pcm_u24be,pcm_u24le,pcm_u32be,pcm_u32le,pcm_u8,rtp,rtsp,sdp,wav"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-parser=aac,aac_latm,flac,h263,h264,mpeg4video,mpegaudio,mpegvideo,vorbis,vp8"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-decoder=aac,aac_latm,mp3,wmalossless,wmapro,wmav1,wmav2,wmavoice,mpeg4,h264"</span><span class="hljs-comment"># FLAGS="$FLAGS --enable-protocol=http,https,mmsh,mmst,rtmp,hls,file,rtsp"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --disable-debug"</span><span class="hljs-keyword">case</span> <span class="hljs-string">"<span class="hljs-variable">$version</span>"</span> <span class="hljs-keyword">in</span>neon)EXTRA_CFLAGS=<span class="hljs-string">"-march=armv7-a -mfloat-abi=softfp -mfpu=neon"</span>EXTRA_LDFLAGS=<span class="hljs-string">"-Wl,--fix-cortex-a8"</span><span class="hljs-comment"># Runtime choosing neon vs non-neon requires</span><span class="hljs-comment"># renamed files</span>ABI=<span class="hljs-string">"armeabi-v7a"</span>;;armv7a)EXTRA_CFLAGS=<span class="hljs-string">"-march=armv7-a -mfloat-abi=softfp"</span>EXTRA_LDFLAGS=<span class="hljs-string">""</span>ABI=<span class="hljs-string">"armeabi-v7a"</span>;;*)EXTRA_CFLAGS=<span class="hljs-string">""</span>EXTRA_LDFLAGS=<span class="hljs-string">""</span>ABI=<span class="hljs-string">"armeabi"</span>;;<span class="hljs-keyword">esac</span>DEST=<span class="hljs-string">"<span class="hljs-variable">$DEST</span>/<span class="hljs-variable">$ABI</span>"</span>FLAGS=<span class="hljs-string">"<span class="hljs-variable">$FLAGS</span> --prefix=<span class="hljs-variable">$DEST</span>"</span>mkdir -p <span class="hljs-variable">$DEST</span><span class="hljs-built_in">echo</span> <span class="hljs-variable">$FLAGS</span> --extra-cflags=<span class="hljs-string">"<span class="hljs-variable">$EXTRA_CFLAGS</span>"</span> --extra-ldflags=<span class="hljs-string">"<span class="hljs-variable">$EXTRA_LDFLAGS</span>"</span> > <span class="hljs-variable">$DEST</span>/info.txt./configure <span class="hljs-variable">$FLAGS</span> --extra-cflags=<span class="hljs-string">"<span class="hljs-variable">$EXTRA_CFLAGS</span>"</span> --extra-ldflags=<span class="hljs-string">"<span class="hljs-variable">$EXTRA_LDFLAGS</span>"</span> | tee <span class="hljs-variable">$DEST</span>/configuration.txt[ <span class="hljs-variable">$PIPESTATUS</span> == <span class="hljs-number">0</span> ] || <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>make cleanmake -j4 || <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>make install || <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span><span class="hljs-keyword">done</span><span class="hljs-built_in">cd</span> ..}function <span class="hljs-function"><span class="hljs-title">ios</span></span>()
{mkdir -p <span class="hljs-variable">$IOSDest</span>CONFIGURE_FLAGS=<span class="hljs-string">"--enable-cross-compile --disable-debug --disable-programs \--disable-doc --enable-pic"</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$X264</span>"</span> ]<span class="hljs-keyword">then</span>CONFIGURE_FLAGS=<span class="hljs-string">"<span class="hljs-variable">$CONFIGURE_FLAGS</span> --enable-gpl --enable-libx264"</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$FDK_AAC</span>"</span> ]<span class="hljs-keyword">then</span>CONFIGURE_FLAGS=<span class="hljs-string">"<span class="hljs-variable">$CONFIGURE_FLAGS</span> --enable-libfdk-aac"</span><span class="hljs-keyword">fi</span><span class="hljs-comment"># avresample</span><span class="hljs-comment">#CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-avresample"</span><span class="hljs-comment"># arm64 armv7 x86_64 i386</span>ARCHS=<span class="hljs-string">"arm64 armv7 x86_64"</span>COMPILE=<span class="hljs-string">"y"</span>LIPO=<span class="hljs-string">"y"</span>DEPLOYMENT_TARGET=<span class="hljs-string">"6.0"</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"$*"</span> ]<span class="hljs-keyword">then</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"$*"</span> = <span class="hljs-string">"lipo"</span> ]<span class="hljs-keyword">then</span><span class="hljs-comment"># skip compile</span>COMPILE=<span class="hljs-keyword">else</span>ARCHS=<span class="hljs-string">"$*"</span><span class="hljs-keyword">if</span> [ <span class="hljs-variable">$#</span> <span class="hljs-operator">-eq</span> <span class="hljs-number">1</span> ]<span class="hljs-keyword">then</span><span class="hljs-comment"># skip lipo</span>LIPO=<span class="hljs-keyword">fi</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$COMPILE</span>"</span> ]<span class="hljs-keyword">then</span><span class="hljs-keyword">if</span> [ ! `which yasm` ]<span class="hljs-keyword">then</span><span class="hljs-built_in">echo</span> <span class="hljs-string">'Yasm not found'</span><span class="hljs-keyword">if</span> [ ! `which brew` ]<span class="hljs-keyword">then</span><span class="hljs-built_in">echo</span> <span class="hljs-string">'Homebrew not found. Trying to install...'</span>ruby <span class="hljs-operator">-e</span> <span class="hljs-string">"<span class="hljs-variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span> \|| <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span><span class="hljs-keyword">fi</span><span class="hljs-built_in">echo</span> <span class="hljs-string">'Trying to install Yasm...'</span>brew install yasm || <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">if</span> [ ! `which gas-preprocessor.pl` ]<span class="hljs-keyword">then</span><span class="hljs-built_in">echo</span> <span class="hljs-string">'gas-preprocessor.pl not found. Trying to install...'</span>(curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl \-o /usr/local/bin/gas-preprocessor.pl \&& chmod +x /usr/local/bin/gas-preprocessor.pl) \|| <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span><span class="hljs-keyword">fi</span><span class="hljs-comment"># if [ ! -r $SOURCE ]</span><span class="hljs-comment"># then</span><span class="hljs-comment">#   echo 'FFmpeg source not found. Trying to download...'</span><span class="hljs-comment">#   curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj \</span><span class="hljs-comment">#       || exit 1</span><span class="hljs-comment"># fi</span><span class="hljs-built_in">cd</span> <span class="hljs-variable">$SOURCE</span>configHeaderFile=<span class="hljs-string">"<span class="hljs-variable">$SOURCE</span>/config.h"</span>make clean<span class="hljs-keyword">if</span> [ ! <span class="hljs-operator">-f</span> <span class="hljs-string">"<span class="hljs-variable">$configHeaderFile</span>"</span> ]; <span class="hljs-keyword">then</span> <span class="hljs-comment"># echo $configHeaderFile</span>rm config.h<span class="hljs-keyword">fi</span><span class="hljs-built_in">cd</span> ..CWD=`<span class="hljs-built_in">pwd</span>`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$CWD</span><span class="hljs-keyword">for</span> ARCH <span class="hljs-keyword">in</span> <span class="hljs-variable">$ARCHS</span><span class="hljs-keyword">do</span><span class="hljs-built_in">echo</span> <span class="hljs-string">"building <span class="hljs-variable">$ARCH</span>..."</span>mkdir -p <span class="hljs-string">"<span class="hljs-variable">$SCRATCH</span>/<span class="hljs-variable">$ARCH</span>"</span><span class="hljs-built_in">cd</span> <span class="hljs-string">"<span class="hljs-variable">$SCRATCH</span>/<span class="hljs-variable">$ARCH</span>"</span>CFLAGS=<span class="hljs-string">"-arch <span class="hljs-variable">$ARCH</span>"</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$ARCH</span>"</span> = <span class="hljs-string">"i386"</span> -o <span class="hljs-string">"<span class="hljs-variable">$ARCH</span>"</span> = <span class="hljs-string">"x86_64"</span> ]<span class="hljs-keyword">then</span>PLATFORM=<span class="hljs-string">"iPhoneSimulator"</span>CFLAGS=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span> -mios-simulator-version-min=<span class="hljs-variable">$DEPLOYMENT_TARGET</span>"</span><span class="hljs-keyword">else</span>PLATFORM=<span class="hljs-string">"iPhoneOS"</span>CFLAGS=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span> -mios-version-min=<span class="hljs-variable">$DEPLOYMENT_TARGET</span> -fembed-bitcode"</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$ARCH</span>"</span> = <span class="hljs-string">"arm64"</span> ]<span class="hljs-keyword">then</span>EXPORT=<span class="hljs-string">"GASPP_FIX_XCODE5=1"</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">fi</span>XCRUN_SDK=`<span class="hljs-built_in">echo</span> <span class="hljs-variable">$PLATFORM</span> | tr <span class="hljs-string">'[:upper:]'</span> <span class="hljs-string">'[:lower:]'</span>`CC=<span class="hljs-string">"xcrun -sdk <span class="hljs-variable">$XCRUN_SDK</span> clang"</span>CXXFLAGS=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span>"</span>LDFLAGS=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span>"</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$X264</span>"</span> ]<span class="hljs-keyword">then</span>CFLAGS=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span> -I<span class="hljs-variable">$X264</span>/include"</span>LDFLAGS=<span class="hljs-string">"<span class="hljs-variable">$LDFLAGS</span> -L<span class="hljs-variable">$X264</span>/lib"</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$FDK_AAC</span>"</span> ]<span class="hljs-keyword">then</span>CFLAGS=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span> -I<span class="hljs-variable">$FDK_AAC</span>/include"</span>LDFLAGS=<span class="hljs-string">"<span class="hljs-variable">$LDFLAGS</span> -L<span class="hljs-variable">$FDK_AAC</span>/lib"</span><span class="hljs-keyword">fi</span>TMPDIR=<span class="hljs-variable">${TMPDIR/%\/}</span> <span class="hljs-variable">$CWD</span>/<span class="hljs-variable">$SOURCE</span>/configure \--target-os=darwin \--arch=<span class="hljs-variable">$ARCH</span> \--cc=<span class="hljs-string">"<span class="hljs-variable">$CC</span>"</span> \<span class="hljs-variable">$CONFIGURE_FLAGS</span> \--extra-cflags=<span class="hljs-string">"<span class="hljs-variable">$CFLAGS</span>"</span> \--extra-ldflags=<span class="hljs-string">"<span class="hljs-variable">$LDFLAGS</span>"</span> \--prefix=<span class="hljs-string">"<span class="hljs-variable">$THIN</span>/<span class="hljs-variable">$ARCH</span>"</span> \|| <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span>make -j3 install <span class="hljs-variable">$EXPORT</span> || <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span><span class="hljs-built_in">cd</span> <span class="hljs-variable">$CWD</span><span class="hljs-keyword">done</span><span class="hljs-keyword">fi</span><span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$LIPO</span>"</span> ]<span class="hljs-keyword">then</span><span class="hljs-built_in">echo</span> <span class="hljs-string">"building fat binaries..."</span>mkdir -p <span class="hljs-variable">$IOSDest</span>/lib<span class="hljs-keyword">set</span> - <span class="hljs-variable">$ARCHS</span>CWD=`<span class="hljs-built_in">pwd</span>`<span class="hljs-built_in">cd</span> <span class="hljs-variable">$THIN</span>/<span class="hljs-variable">$1</span>/lib<span class="hljs-keyword">for</span> LIB <span class="hljs-keyword">in</span> *.a<span class="hljs-keyword">do</span><span class="hljs-built_in">cd</span> <span class="hljs-variable">$CWD</span><span class="hljs-built_in">echo</span> lipo -create `find <span class="hljs-variable">$THIN</span> -name <span class="hljs-variable">$LIB</span>` -output <span class="hljs-variable">$IOSDest</span>/lib/<span class="hljs-variable">$LIB</span> <span class="hljs-number">1</span>>&<span class="hljs-number">2</span>lipo -create `find <span class="hljs-variable">$THIN</span> -name <span class="hljs-variable">$LIB</span>` -output <span class="hljs-variable">$IOSDest</span>/lib/<span class="hljs-variable">$LIB</span> || <span class="hljs-keyword">exit</span> <span class="hljs-number">1</span><span class="hljs-keyword">done</span><span class="hljs-built_in">cd</span> <span class="hljs-variable">$CWD</span>cp -rf <span class="hljs-variable">$THIN</span>/<span class="hljs-variable">$1</span>/include <span class="hljs-variable">$IOSDest</span><span class="hljs-keyword">fi</span><span class="hljs-built_in">echo</span> Done
}ios
android
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li><li>210</li><li>211</li><li>212</li><li>213</li><li>214</li><li>215</li><li>216</li><li>217</li><li>218</li><li>219</li><li>220</li><li>221</li><li>222</li><li>223</li><li>224</li><li>225</li><li>226</li><li>227</li><li>228</li><li>229</li><li>230</li><li>231</li><li>232</li><li>233</li><li>234</li><li>235</li><li>236</li><li>237</li><li>238</li><li>239</li><li>240</li><li>241</li><li>242</li><li>243</li><li>244</li><li>245</li><li>246</li><li>247</li><li>248</li><li>249</li><li>250</li><li>251</li><li>252</li><li>253</li><li>254</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li><li>210</li><li>211</li><li>212</li><li>213</li><li>214</li><li>215</li><li>216</li><li>217</li><li>218</li><li>219</li><li>220</li><li>221</li><li>222</li><li>223</li><li>224</li><li>225</li><li>226</li><li>227</li><li>228</li><li>229</li><li>230</li><li>231</li><li>232</li><li>233</li><li>234</li><li>235</li><li>236</li><li>237</li><li>238</li><li>239</li><li>240</li><li>241</li><li>242</li><li>243</li><li>244</li><li>245</li><li>246</li><li>247</li><li>248</li><li>249</li><li>250</li><li>251</li><li>252</li><li>253</li><li>254</li></ul>

这段脚本可以编译出android和ios的两个平台的配置,当然根据你的需求在configure中配置需要的东西,否则ffmpeg编译出来之后还是很大。
顺便解释一下:SOURCE=”ffmpeg-3.1.1”这个是release ffmpeg的版本,通过curl去下载,然后会在脚本的目录出下载并解压生成一个ffmpeg-3.1.1目录。
这个脚本有两个事情需要说明:

  1. 如果不修改configure文件,android平台编译出来的so文件名有问题,会在.so后面带上版本号,这个在android中识别不了的。
  2. 如果修改了configure文件,在编译ios平台的时候会遇到一个no file or directory的问题。导致完成后install的时候失败。
    建议:
    先编译ios平台,然后在修改configure,具体修改如下:

将下面的内容

<code class="hljs makefile has-numbering"><span class="hljs-constant">SLIBNAME_WITH_MAJOR</span>='<span class="hljs-variable">$(SLIBNAME)</span>.<span class="hljs-variable">$(LIBMAJOR)</span>'
<span class="hljs-constant">LIB_INSTALL_EXTRA_CMD</span>='$<span class="hljs-variable">$(RANLIB)</span> "<span class="hljs-variable">$(LIBDIR)</span>/<span class="hljs-variable">$(LIBNAME)</span>"'
<span class="hljs-constant">SLIB_INSTALL_NAME</span>='<span class="hljs-variable">$(SLIBNAME_WITH_VERSION)</span>'
<span class="hljs-constant">SLIB_INSTALL_LINKS</span>='<span class="hljs-variable">$(SLIBNAME_WITH_MAJOR)</span> <span class="hljs-variable">$(SLIBNAME)</span>'</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

修改为:

<code class="hljs makefile has-numbering"><span class="hljs-constant">SLIBNAME_WITH_MAJOR</span>='<span class="hljs-variable">$(SLIBPREF)</span><span class="hljs-variable">$(FULLNAME)</span>-<span class="hljs-variable">$(LIBMAJOR)</span><span class="hljs-variable">$(SLIBSUF)</span>'
<span class="hljs-constant">LIB_INSTALL_EXTRA_CMD</span>='$<span class="hljs-variable">$(RANLIB)</span> "<span class="hljs-variable">$(LIBDIR)</span>/<span class="hljs-variable">$(LIBNAME)</span>"'
<span class="hljs-constant">SLIB_INSTALL_NAME</span>='<span class="hljs-variable">$(SLIBNAME_WITH_MAJOR)</span>'
<span class="hljs-constant">SLIB_INSTALL_LINKS</span>='<span class="hljs-variable">$(SLIBNAME)</span>'</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

当然如果你是shell脚本高手,在编译android的时候通过sed命令将上面提到内容进行修改也是可以的。
编译完成之后将编译出来的lib(so文件或者.a文件)和include(头文件)拷贝到你android studio中和xcode中。android具体如图:

gradle脚本配置:

<code class="hljs javascript has-numbering">ndk {moduleName <span class="hljs-string">"FFPlayer"</span>stl <span class="hljs-string">"stlport_static"</span>cFlags <span class="hljs-string">"-std=gnu++11 -DGL_GLEXT_PROTOTYPES"</span>abiFilters <span class="hljs-string">"armeabi"</span>, <span class="hljs-string">"armeabi-v7a"</span><span class="hljs-built_in">String</span> basePath = <span class="hljs-keyword">new</span> File(<span class="hljs-string">"./"</span>).canonicalPath + <span class="hljs-string">"/ffplaylib/src/main/jniLibs/armeabi/"</span><span class="hljs-built_in">String</span> libavcodec =  basePath + <span class="hljs-string">"libavcodec-54.so"</span><span class="hljs-built_in">String</span> libavdevice = basePath + <span class="hljs-string">"libavdevice-54.so"</span><span class="hljs-built_in">String</span> libavfilter = basePath + <span class="hljs-string">"libavfilter-3.so"</span><span class="hljs-built_in">String</span> libavformat = basePath + <span class="hljs-string">"libavformat-54.so"</span><span class="hljs-built_in">String</span> libavutil = basePath + <span class="hljs-string">"libavutil-51.so"</span><span class="hljs-built_in">String</span> libswresample = basePath + <span class="hljs-string">"libswresample-0.so"</span><span class="hljs-built_in">String</span> libswscale = basePath + <span class="hljs-string">"libswscale-2.so"</span>ldLibs <span class="hljs-string">"log"</span>,<span class="hljs-string">"GLESv2"</span>,<span class="hljs-string">"dl"</span>, <span class="hljs-string">"GLESv1_CM"</span>,<span class="hljs-string">"GLESv2"</span>, <span class="hljs-string">"android"</span>,libavcodec, libavdevice, libavfilter, libavformat, libavutil,libswresample,libswscale}sourceSets {main {jni.srcDirs  <span class="hljs-string">"src/main/jni"</span>, <span class="hljs-string">"src/main/jni/include"</span>,<span class="hljs-string">"src/main/jni/include/libavcodec"</span>,<span class="hljs-string">"src/main/jni/include/libavdevice"</span>,<span class="hljs-string">"src/main/jni/include/libavfilter"</span>,<span class="hljs-string">"src/main/jni/include/libavformat"</span>,<span class="hljs-string">"src/main/jni/include/libavutil"</span>,<span class="hljs-string">"src/main/jni/include/libswresample"</span>,<span class="hljs-string">"src/main/jni/include/libswscale"</span>, <span class="hljs-string">"src/main/jni/SDL"</span>, <span class="hljs-string">"src/main/jni/SDL/include"</span>jniLibs.srcDirs <span class="hljs-string">"src/main/jinLibs"</span>}}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li></ul>

第一个是ndk配置,配置moduleName等,同时指定本地依赖libavcodec等so库。
sourceSets主要是制定include头文件路径。
这样就能移植进入android studio中,而不是在eclipse中。

而对ios想到简单一些。具体如图:

因为这边是用Swift写的应用,所以还需要指定Swift compiler和Search path

Search path:

Swift compiler

Swift compiler的头文件如下:

做完这些之后就可以在代码中直接引用了。


在android中是通过jni调用Native代码的,这里我就详细介绍了。

3、总结

本文讲述从服务端到客户基本环境部署,其中包括一些关键的东西点。下一篇直播技术的文章将阐述android和ios如何播放视频代码。再之后将会详细介绍ffmpeg以及其基本架构。之后会叙述服务端nginx.conf基本配置以及客户端采集推流相关的东西。

直播技术(从服务端到客户端)一相关推荐

  1. 成品app直播源码,服务端与客户端传输视频文件

    成品app直播源码,服务端与客户端传输视频文件相关的代码 Server端 #define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARN ...

  2. 使用HTML5的WebSocket实现服务端和客户端数据通信(有演示和源码)

    WebSocket协议是基于TCP的一种新的网络协议.WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信. ...

  3. Java Websocket实例【服务端与客户端实现全双工通讯】

    Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...

  4. 【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

    HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket.现在把 HP-Socket 的所有代码向大众公开,希望能对大 ...

  5. 网络基础 + 简易服务端和客户端

    网络架构及其演变过程 单机架构 - 就只有一个客户端,不需要和服务器交换数据 CS架构 - 客户端(Client)--- 服务端(Server) - - 客户端:用户安装软件 - - 服务端:统一管理 ...

  6. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  7. web 服务端与客户端交互

    Web server to client communication Technology 1.   Traditional solution 传统模式的 Web 系统以客户端发出请求.服务器端响应的 ...

  8. 服务端向客户端主动发送消息

    通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请 ...

  9. 破甲两千六 Spring Cloud 教程(三):添加Spring Cloud 的 Netflix Eureka 插件,实现服务端、客户端的发现与注册

    写在前面: Spring Cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等. 5大常用组件: 服务发现 ...

最新文章

  1. 「学习笔记-Linux」学习Shell Script
  2. 在WisOne平台上学习TypeScript
  3. linux 清理内存的c函数,Linux C函数之内存配置函数
  4. 表格合并行_合并行table表格
  5. Vim功能键整理(图片来自mooc)
  6. Sliverlight MD5
  7. cmd批量修改文件名 增加文字_Dynamo自动批量化修改文件名称
  8. js+canvas绘制360加速球
  9. 百度AI攻略:iOCR自定义模板功能
  10. 自定义xml解析框架
  11. 什么是exploit
  12. Gitlab Code Review
  13. uniapp中h5版uni.chooseimage直接上传图片(图片路径blob:http://xxxx/xxxx)到阿里云oss上,获取图片名称并成功显示图片
  14. 【Html】 Html写静态淘宝页面
  15. 人工智能的局限性--王垠
  16. 【XJTUSE计算机图形学】第三章 几何造型技术(3)——B样条曲线与曲面
  17. 全员全域安全守护,蔚来ET7获Euro NCAP五星安全评级背后的硬核实力
  18. 艺术摄影--光线的运用(2学时)--SDUST
  19. word 插入分隔符实现章节单独编页
  20. EventBus报错:and its super classes have no public methods with the @Subscribe annotation

热门文章

  1. 【C语言】熄灯问题 枚举法
  2. 枚举-熄灯问题(算法基础 第2周)
  3. C语言单线程实现KEY插拔,2009年12月5日
  4. 2006年在职攻读硕士学位全国联考参考答案
  5. 【二】2D测量 Metrology——align_metrology_model()算子
  6. rasa填槽slot
  7. 常用版本名称含义:SNAPSHOT-alpha-beta-release-GA等
  8. 全国县域数字农业农村电子商务发展报告
  9. b级计算机考试在线试题及答案,全国计算机一级考试试题及答案
  10. 手动编译LUCI 到 openwrt中 并且解决'/bin/po2lmo': Permission denied问题