ffmpeg fork一个子进程利用hls的ts流切片来实现直播

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值