天天看點

ts封裝,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的工具分析

ts封裝,H264和aac 封裝成為ts,并生成m3u8

工具的下載下傳位址 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;
}
           

第二部把視訊幀進行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;
}
           

本機生成的ts,通過本地的http伺服器可以觀看到hls協定

ts封裝,H264和aac 封裝成為ts,并生成m3u8

#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