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文件也會動態更新,這樣播放器就能不斷播放視頻而不會停下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章