前言

我用手机录制了一段视频,准备用exoplayer进行播放,当我准备将mp4文件放入工程时我发现文件太大了,这样app体积会很大,于是我找了个办法,把文件放到网上,但是我发现除了上传视频网站发布我好像没有其他办法(没玩过服务器),后来想到github不是可以放文件吗,研究了一下。

下载工具并调出命令行

去官网FFmpeg下载工具,获取包和可执行文件。因为我使用的windows,直接去发布版本里找到这个ffmpeg-4.4-essentials_build.zip,下载解压之后把ffmpeg.exe复制到需要使用他的地方(我的路径 J:\haizhuo\vedio\m3u8\),调出命令行,切换到此目录下键入:

ffmpeg

打印结果

ffmpeg version 4.4-essentials_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

证明ffmpeg工具能正常使用了,下面我们就使用命令来操作文件吧。

先用播放器查看下视频参数

如何使用github上的CNN代码 githubcdn_windows

对视频进行转码

输出格式为:视频编码 h.264,音频编码 aac 格式的 mp4 文件

# infile.mp4 是待转码的文件(可以是其他格式,比如 avi…… 之类的)
# outfile.mp4 是转码输出文件
# libx264 转为 h.264 编码
ffmpeg -i infile.mp4  -c:v libx264 -strict -2 outfile.mp4

mp4转换为ts

我使用视频为second_five.mp4
键入命令后生成second_five.ts文件

ffmpeg -y -i second_five.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb second_five.ts

如何使用github上的CNN代码 githubcdn_windows_02


我们会发现ts和mp4文件大小是不一样的,因为ffmpeg命令有很多参数,没有设置则使用的默认的,我这里就不研究了,有兴趣的可以去撸文档。

开始切片并生成播放列表m3u8文件

首先,我们知道Github上传文件大于100M的时候,会提示push会reject,虽然有办法传,但是还是不推荐。然后 jsDeliver 不支持加载超过 20M 的资源,所以切片是最好的方式。我这里把视频切片后传到Github,然后通过免费cdn【jsdelivr】获取我传到github的m3u8文件,最后通过exoplayer播放。exoplayer是支持hls的,自带有ui库里有直接可以使用的播放器套件,很方便。

键入

# second_five.mp4 需要切片的视频文件(也可以使用second_five.ts)
# playlist.m3u8 待生成的 m3u8 文件名
# 240  切片时间,表示隔几秒进行切一个文件
# output%03d.ts 生成切割ts文件名,output%03d.ts 代表生成 output001.ts、output002.ts 这样的格式,03d 可以随意修改,占位符
ffmpeg -i second_five.mp4 -c copy -map 0 -f segment -segment_list play_list.m3u8 -segment_time 200 second_five%03d.ts

//ffmpeg -i second_five.mp4 -hls_time 240 playlist.m3u8
# -g 24代表每24 帧一个关键帧,
//ffmpeg -i second_five.mp4 -g 24 -hls_time 240 playlist.m3u8

关于关键帧:越大压缩越好,但是画质变低,越小则反之。示例视频的帧率近似24,所以我们可以把关键帧设置为24,不过默认的其实就可以了。


分析一波:时间长短不一,文件大小不一(014竟然超过了20M)。此视频长度为62分钟,大小为234MB。为了解决问题,我把时间长度从240改为了200,这下所有文件都小于20M了。

把视频文件上传到Github仓库

注意:虽然Github看上去是一个没有限制空间大小的天然文件床,但是不意味着你可以把他当图床或者视频床来用,哪怕是分片的视频片段。频繁的访问文件url会导致被封!!


规则如下

//version不填则默认获取最新的版本
https://cdn.jsdelivr.net/gh/user/repo@version/file

假设视频源地址为

https://github.com/Tom/resouce/tree/main/vedio/m3u8/SecondFive/play_list.m3u8

用户名user:Tom
库名repo:resouce
文件路径:vedio/m3u8/SecondFive
文件名:play_list.m3u8

所以通过CDN获取的地址url为(🤣地址是假的,提供一个思路,玩玩就行,访问太频繁会报502甚至号被封掉):

https://cdn.jsdelivr.net/gh/Tom/resouce/vedio/m3u8/SecondFive/play_list.m3u8

使用exoplayer的SimpleExoPlayer控件进行播放如图:

如何使用github上的CNN代码 githubcdn_语音识别_03


播放还是能播的,纯娱乐。

后话

jsdelivr使用条款有写到:禁止使用存放视频、文件备份或者其他大量的文件。推荐自己搭OOS(阿里云对象存储服务)或者上传b站、youtube这种平台。