项目不能上传见谅⚠️
---找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,长这样👇
视频参数解析Invisor,长这样👇
希望能帮到处于和我一样困境的你mua,下课。