hls的ts流切片相關看這個:https://blog.csdn.net/weixin_38890593/article/details/96965164
下面看代碼:
int main(int argc, char *argv[]) {
//int main(void) {
SDL_Event event;
VideoState *is;
char str_url[1024];
pid_t pid;
is = av_mallocz(sizeof(VideoState));
if(argc < 2) {
fprintf(stderr, "Usage: command <filename>\n");
exit(1);
}
sprintf(str_url,"ffmpeg -re -i \"%s\" -codec copy -map 0 -f hls -hls_list_size 10 -hls_wrap 10 -hls_time 10 playlist.m3u",argv[1]);
//argv[1]就是視頻的URL
//開新的進程獲取直播的TS流
if((pid = fork()) <0)
exit(-1);
else if(pid == 0)
{
printf("[Child process] Pid:%d Cid:%d\n",getpid(),getppid());
system(str_url); //這個進程做ts流的更新、切片等
}
else
{
//播放器核心功能
//這裏主要介紹fork來做獲取TS流,就不貼播放器代碼了,總代碼上千行太繁雜
}
}
上面的用僞代碼來看就是:
void main()
{
//fork一個進程獲取ts流
fork() --> system("獲取ts流到playlist");
sleep();//播放之前最好休眠幾秒,等待playlist的準備,就這點來說不是很好,需要等待
//主進程進行播放
}
這只是我用fork來測試一下hls的切割ts流的直播效果而已,應用到工作還需調整,建議用線程來做!
編譯好產生可執行文件a.out,下面執行這個播放這個視頻源:
./a.ou http://120.87.10.21:8888/17/areaNode/1/20190613/90000001000000025935202675211717/00000000000000035935201831114365-0.m3u8?playType=vod&AuthInfo=1FkVPtjWsQnJnajhl0O%2FX3Dm9whGy45k5dNDKH06ZNx%2BHOxq3RwPMbZomNPItCWSmX2qKRTXUEl9%0A4cnqSHYIxg%3D%3D&UserID=14000471539&SubContentID=1560154395638121&vipTag=1&reset=0
下面是效果截圖,可以看到hls的ts流切割以及視頻的播放~ 一切順利
下面看看進程狀態,可以看到項下面進程的狀態,前面幾個T和S,這是TS流的獲取和切片過程。
看下產生的文件及它們大小
可以看到有個m3u文件,和10個ts流文件。
這10個ts會實時獲取更新,m3u文件也會動態更新,這樣播放器就能不斷播放視頻而不會停下。