Loading... > 还是为了家中老人,老人有的时候不在家,关注的主播直播内容就容易错过,用python是可以录制,但是家中老人还不会弄电脑,就衍生了这个项目-_-! # 原理 1. 安装ffmpeg 2. php解析抖音直播地址 3. php调用ffmpeg将转换过来的直播地址进行录制 4. 添加定时任务,定时调用脚本 # 安装ffmpeg 我的环境是centos7.x,先更新下yum,采用yum的方式进行安装ffmpeg,先更新下当前yum ```shell yum -y update ``` 安装Nux Dextop Yum 源**(慎重操作)** ```shell sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm ``` 安装FFmpeg 和 FFmpeg开发包 ```shell sudo yum install ffmpeg ffmpeg-devel -y ``` 测试ffmpeg是否成功安装 ```shell ffmpeg ``` *这里补充下,我的环境是宝塔环境,宝塔之前的一键包安装ffmpeg已经失效了,问题很多,在这里不建议大家采用宝塔的一键包,我现在的安装方案是采用宝塔论坛[CentOS7宝塔面板安装ffmpeg视频切片模块](https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=41784&highlight=ffmpeg) `yaojiu`的安装方式。 # 解析抖音直播地址 这里的抖音直播源解析是通过我前一段时间写的[`php抖音直播源抓取`](https://www.jonasen.cn/share/149.html)进行的解析,原理就是所有的信息都在 `window.__INIT_PROPS__`这个部分当中,而这部分内容是json结构的,所以我们只要将这部分代码转为能够读取的json然后进行调用就可以,需要的小伙伴自行观看。 传递回来的参数为: ```json {"code":200,"success":true,"data":{"url":"http:\/\/pull-hls-l6.douyincdn.com\/stage\/stream-685625243370782751_or4\/index.m3u8","title":"jonasen\u6b63\u5728\u76f4\u64ad","id":6986527143291637000,"status":2}} ``` # php调用ffmpeg进行录制 php如果直接调用ffmpeg是不行的,我们需要执行proc_open,proc_get_status,proc_close命令,所以要将php.ini中对应的命令启用。 我这里做了个自动判断直播状态,传递回来的参数中如果status不等于2的情况下,代表当前录播已经停止,所以执行一次停止直播的命令,虽然ffmpeg在抖音关播以后会自动停止(亲测),但是保险期间还是做了一个容错。 以下是我用thinkphp5测试过后的代码: ```php <?php /****抖音直播录制接口*******/ namespace app\controller; use app\BaseController; use think\facade\Request; class Live extends BaseController { public function index(){ $url=Request::param('url'); $status=Request::param('status');//停止录播传个任意参数 $apiUrl="http://xx/Douyin?url=".$url;//获取抖音直播的接口,见本博客 $returnData=file_get_contents($apiUrl); $data=json_decode($returnData,true); if($data['code']==200){ if($data['data']['status']==2){ if(!empty($status)){ if(!file_exists($data['data']['id'].".txt")){ echo "当前直播不存在"; die(); } $pid=file_get_contents($data['data']['id'].".txt"); proc_close(proc_open('kill -9 '.$pid, array(), $pipes));//杀死进程 unlink($data['data']['id'].".txt"); echo "已停止录播"; exit(); } //判断当前直播是否正在录屏中 if(file_exists($data['data']['id'].".txt")){ echo "当前直播正在进行中"; die(); } //直播正在进行中 $command="ffmpeg -i ".$data['data']['url']." -c copy -bsf:a aac_adtstoasc -f mp4 /www/wwwroot/当前网站路径/public/upload/".$data['data']['id'].".mp4 >/dev/null 2>&1 &"; $process = proc_open($command, array(),$pipes); //执行录屏命令 $var = proc_get_status($process); //获取命令进程信息 $pid = intval($var['pid'])+1;//pid就是进程ID,$var['pid']得到的ID比实际的少1 $pidFile = fopen($data['data']['id'].".txt", "w+");//创建当前任务信息文档 fwrite($pidFile, $pid); fclose($pidFile); echo "正在录播"; }else{ $pid=file_get_contents($data['data']['id'].".txt"); proc_close(proc_open('kill -9 '.$pid, array(), $pipes));//杀死进程 unlink($data['data']['id'].".txt"); echo "已停止录播"; exit(); //结束 echo "直播已经结束"; } }else{ echo "未获取到直播信息"; } } } ``` # 计划任务 在宝塔中添加定时任务,访问地址为:  # 相关网址 开始直播: http://xxx.cn/Live?url=https://v.douyin.com/et3Nt53/ 结束直播: http://xxx.cn/Live?url=https://v.douyin.com/et3Nt53/&status=1 最后修改:2021 年 07 月 19 日 04 : 16 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信
2 条评论
不错,必须顶一下!
真厉害