因工作问题,最近需要做到一个视频录制能在Android和IOS两个平台上播放,而Android已经把录制视屏的格式设置为3gp,(这样文件比较小适合流量小的传输)
那我们IOS这边也支持3gp吧
apple的官方文档上是支持3gp格式的视频文件的,但大多数人都发现真正播放的时候会出现 "cannot decode"(无法解码)
这意思是说你的3gp编解码格式不对,才不能播放的,那解决办法就是按照appple 的编码格式来录制视频就能播放了
那apple需要什么编码呢,看文档
Supported Formats
This class plays any movie or audio file supported in iOS. This includes both streamed content and fixed-length files. For movie files, this typically means files with the extensions.mov, .mp4, .mpv, and.3gp and using one of the following compression standards:
- H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. (The Baseline profile does not support B frames.)
- MPEG-4 Part 2 video (Simple Profile)
If you use this class to play audio files, it displays a white screen with a QuickTime logo while the audio plays. For audio files, this class supports AAC-LC audio at up to 48 kHz, and MP3 (MPEG-1 Audio Layer 3) up to 48 kHz, stereo audio.
这就是说你的视频编码是h264的,每秒30帧(这里是支持到640x480 我用320x240也是没有问题的)
如果以上你做到了,你会发现……!!!还是播放不了的~~~
重点来了
你的音频编码格式可能不是AAC-LC的!
我不能不吐槽下了,录制视频跟音频有毛关系,但后来一想,也是,录制视频的时候其实音频也是录制的如果音频格式不是用AAC编码而是用AMR什么的编码,他仍然是播放不了的
至此,把录制视频时候的音频参数改为AAC-lc 你的3gp视频就可以播放了
另外普及下知识
3gp 和 H264 什么关系?还有什么MP4什么的什么意思
3gp和mp4都是container,就是文件格式,那什么是文件格式呢,举个例子,你有一张白纸,上面打上横向一条条的格,就是一种格式暂且叫他3gp吧,同样一张白纸,所有格子都是竖向的,那这是另外一种格式叫mp4,现在,看看你的纸,横向格子一般都是横向的写字,就像现在外面卖的笔记本(不是笔记本电脑~)一样,而竖向格子的,更像是过去的竹简方式的写字,他写字的方式书竖向的,这种不同打格子的方式就是不同的格式,3gp一种格式 mp4一种格式 avi又是另一种格式,不同的格子写出来的字存储信息量不一样,速度也不一样
h264是一种编码方式,上面说了3gp既然已经做好了格子,那我们就该写字了,但是你写什么字呢?汉字?英语?阿拉伯语?还是摩斯电码? 对于计算机来说,要想存储大量的数据就是需要一种把文字,转换为一个符号的方法,这样一页纸原本只能写100个汉字的内容,如果用英语写,可能是150个,摩斯电码可能是300个
h264就是其中一种编码格式,他把其中一些信息按照规定的方式编码成一个文件,等到播放时,在按照这个方式去解码,这样就可以播放了
例如,我们要发送下面的文字
“今晚你有空吗,我们一起去吃饭吧”
这几个文字如果我们定义一个密语为 jw,那么我们实际发送的信息内容就是jw
而对方收到jw后,按照解码方式解码,解完后的意思就是
“今晚你有空吗,我们一起去吃饭吧”
这样做的好处就是省去了空间,原本14个汉字要表达的意思,结果jw 2个英文就表达了,如果还想说点什么,可以在jw后接着写编码……
如何看视频的编码格式
最简单的方法是找到3gp文件,用KMplayer 打开,播放的时候右键-媒体信息,你就能看到视频和音频的编码格式了
下面是我的3gp视频编码格式
AVC就是H264,你会发现我的音频编码是AVC的,这也就是为什么我之前无法播放视频的原因
General
Format : AVC
Duration : 1974
Video #1
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L3.0
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 1s 901ms
Source duration : 1s 974ms
Bit rate : 196 Kbps
Width : 320 pixels
Height : 240 pixels
Display aspect ratio : 4:3
Frame rate mode : Variable
Frame rate : 28.880 fps
Minimum frame rate : 9.376 fps
Maximum frame rate : 32.514 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.089
Stream size : 45.7 KiB (85%)
Source stream size : 47.1 KiB (88%)
Title : VideoHandle
Language : English
mdhd_Duration : 1901
Audio #2
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L3.0
Stream size : 8 bits
Language : 45.7 KiB