iOS中265与264编解码播放问题记录

项目不能上传见谅⚠️

---找hvc1在ffmpeg设置的同学直接跳到结尾---

项目描述:流数据经过sdk传输音视频到终端,解析播放保存等。
出现问题:H265视频保存后无法播放。

265与264的基础知识不再赘述,网上相关资料很多。
可以根据以下几种直接搜,超级详细:
1.FFmpeg
2.软解 硬解
3.I帧 P帧 B帧 (本文没有B帧)
4.vps sps pps

-->>相关知识点很多需要时间整理<<--

开始介绍处理时的区别,这方面网上的文章较少(也可能是我不会找)。

硬解部分(软解现在很少了就不再说明了)

⚠️取帧⚠️
265(HEVC)的 vps sps pps I帧

 我这里流数据为uint8_t
 (data[4] & 0x7E)>>1 == 19 //IDR帧关键帧
 (data[4] & 0x7E)>>1 == 33 //SPS
 (data[4] & 0x7E)>>1 == 34 //PPS
 (data[4] & 0x7E)>>1 == 32 //VPS

264(AVC)(没有vps⚠️)的 sps pps I帧

 4-8位为nal单元类型 
 (data[4] & 0x1F == 0x05 //IDR帧关键帧
 (data[4] & 0x1F == 0x07 //SPS
 (data[4] & 0x1F == 0x08 //PPS

保存视频阶段

如果按照正常的265流程,会出现播放视频无画面有声音的情况
原因 :
hev1 or hvc1是两种codec tag,表示mov或者其他容器中hevc流的不同打包方式
苹果不支持265的hev1 (这种是国际标准的,苹果不用,就是玩?)

解决路线:

全局宏
#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))

ffmpeg3.0以后:

搞AVStream的AVCodecParameters的tag,在avformat_write_header前将AVCodecParameters的tag设置为MKTAG('h', 'v', 'c', '1')

ffmpeg3.0以前:

(3.0以前是没有AVCodecParameters的)
AVStream的AVCodecContext中的codec_tag如下设置,大概这样

_videoStream->codec->codec_tag = MKTAG('h', 'v', 'c', '1');

解决过程中有助力的工具!
强大的播放器VLC,长这样

WeChat97ca375b9bcec118a58dd76209a5d678.png

视频参数解析Invisor,长这样

WeChat7fb5a8436bc4c65ddc3f352c8cd7416b.png

WeChate571b50130270fe2ea5dbfeb7d2b89cf.png

希望能帮到处于和我一样困境的你mua,下课。

你可能感兴趣的:(iOS中265与264编解码播放问题记录)