H264和aac 封装成为ts,并生成m3u8


H264和aac 或者mp3 合并成为ts,并生成m3u8,本地通过http进行观看,支持手机和浏览器播放器观看
ts文件分为三层:ts层(Transport Stream)、pes层(Packet Elemental Stream)、es层(Elementary Stream)。es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层是在pes层上加入了数据流识别和传输的必要信息。
我们先看ts文件的格式分析
通过easyice的工具分析

工具的下载地址 https://pan.baidu.com/s/1o6MDf1C#list/path=%2Feasyice
可以看出ts 文件每一个片都是188个字节,TS 流都是固定等长的188字节包 ,
每个188个字节可以是pat、pmt、音视频包数据,pmt主要是说明这个ts有那些格式,具体格式可以参考pes的

参考的代码如下
第一步写入pat和pmt,在ts文件头就可以

int CTsEncoder::OpenFile(std::string tsFileName)
{
AutoLock(&mutex_Lock);
m_file = fopen(tsFileName.c_str(),"wb");
if (!m_file)
{
return -1;
}
//打开文件的时候写入pat和pmt
PutPat();
PutPmt();
return 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
第二部把视频帧进行188个字节的切片

void CTsEncoder::handleVideo(uint8_t* vidoebuf,uint32_t bufsize,int64_t tic,bool bkey)`在这z里插入代码片`
{
int64_t ticFrameRate;
ticFrameRate =tic;// CheckTimeStamp(tic);

// 查找NAL起始字节
bool bBegin = true;
buffer pesBuffer;
buffer tsBuffer;
//es 打包成为pes
CreatePesVideoPacket(&pesBuffer,(uint8_t *)vidoebuf,bufsize,bkey,ticFrameRate);
bool bFritsTsPacket = true;;
uint32_t nread = 0;
int remainSize;
//进行切片
while(nread < pesBuffer.d_cur)
{
if (bFritsTsPacket)
{
bFritsTsPacket = false;
remainSize = pesBuffer.d_cur - nread;
//进行第一个188字节打包,打包主要是adaptation_field 时间戳、pcr
if(remainSize <= FRISTTSLEN)
{
PutFristTsVideo(&tsBuffer,ticFrameRate,FRISTTSLEN - pesBuffer.d_cur);
append_data(&tsBuffer,pesBuffer.data,pesBuffer.d_cur);
}
else
{
PutFristTsVideo(&tsBuffer,ticFrameRate,0);
append_data(&tsBuffer,pesBuffer.data,FRISTTSLEN);
}
nread = FRISTTSLEN;
}
else
{
remainSize = pesBuffer.d_cur - nread;
//中间填充数据
if ( remainSize >= MINTSLEN )
{
PutMiddleTsVideo(&tsBuffer);
append_data(&tsBuffer,pesBuffer.data + nread,MINTSLEN);
nread += MINTSLEN;
}
else
{
//结尾由于数据不够需要填充0xff的数据
PutlastTsVideo(&tsBuffer,MINTSLEN - remainSize);
append_data(&tsBuffer,pesBuffer.data + nread,remainSize);
nread += remainSize;
}
}
}
WritetoFile(&tsBuffer);
tsBuffer.Clear();
m_bVideobegin = true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
本机生成的ts,通过本地的http服务器可以观看到hls协议


#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:8
#EXTINF:8,
2019_04_10_14_31_42.ts
#EXTINF:8,
2019_04_10_14_31_58.ts
#EXTINF:8,
2019_04_10_14_32_08.ts
#EXTINF:8,
2019_04_10_14_32_17.ts
#EXTINF:8,
2019_04_10_14_32_25.ts
#EXTINF:8,
2019_04_10_14_32_33.ts
#EXTINF:8,
2019_04_10_14_32_42.ts
#EXTINF:8,
2019_04_10_14_32_50.ts

live.m3u8文件的详细内容
demo下载地址http://www.pudn.com/Download/item/id/3878596.html
demo的使用说明
1.打开testTs.exe 会在D:/live目录下生成ts文件和m3u8格式
2.nginx-1.5.7执行底下的exe文件,默认的http端口是80
3.通过http://ossrs.net/players/jwplayer6.html?vhost=demo.srs.com&app=live&hls_autostart=true&stream=livestream 地址打开http://127.0.0.1:80/live/live.m3u8 就可以观看
可以需要在d盘下配置一个flash的跨域文件
crossdomain.xml
如有问题请联系 qq595431256
---------------------
作者:du.剑子仙迹
来源:CSDN
原文:https://blog.csdn.net/weixin_42330091/article/details/89176924
版权声明:本文为博主原创文章,转载请附上博文链接!

优质内容筛选与推荐>>
1、判断一个二叉树是否是平衡二叉树
2、BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
3、MyBatis的接口式编程Demo
4、C++语法之-------strcpy,memcpy,memset
5、Harmonic Number


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号