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文件也会动态更新,这样播放器就能不断播放视频而不会停下。