视频流分片后的ts片,H265压缩。复制时间流命令

视频太大,想让压缩后播放,怎样压缩叻?一般改变视频屏幕大小或者码率都不能很好的压缩视频,会出现变形失真等情况。

本文说的视频压缩是H265压缩既视频转换格式的方法来达到的。

要求做一个视频上传,前台播放的功能,由于条件有限,需要压缩视频的功能。

视频上传后,就已经使用命令达到分割成视频流文件:

/****视频分割生成ts分片和索引文件m3u8***/
//php配置要求开启system执行权限。php.ini里面修改(具体百度)
//先将视频转换成视频ts文件
$str="ffmpeg -y -i video/xinxinsn.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb video3/output.ts";
system($str,$res);
echo $res;
 
//将ts视频文件分割成视频流文件ts,并生成索引文件m3u8
$str="ffmpeg -i video3/output.ts  -c copy -map 0 -f segment -segment_list video3/index.m3u8 -segment_time 10 video3/video-%03d.ts";
system($str,$res);
echo $res;

 在上传视频时,怎样压缩视频,曾想在分割成视频流命令中增加压缩命令,既可以分割视频,又可以压缩视频,想象太美好。这个方法是不可行的

//增加-c:a copy -c:v libx264压缩
$str="ffmpeg -i video3/output.ts  -c copy -map 0 -f segment -segment_list video3/index.m3u8 -c:a copy -c:v libx264  -segment_time 20 video3/video-%03d.ts";
system($str,$res);
echo $res;

压缩命令是没有问题的,可以执行,也可以压缩并同时分割,但是执行过程耗时比较长,用php调用直接请求超时,并且cpu占用率很高。考虑到超时、占cpu等元素此方法不可取。调用此压缩命令很多人提出用电脑或者服务器任务计划来定时执行,统一压缩。这个方法确实好,选择晚上无人访问服务器时,进行执行此命令,对服务器要好太多了,但是如果上传视频当天想自定义压缩怎么办叻?

先来分析视频分割成视频流文件。

视频分割成视频流文件如下:

视频流分片后的ts片,H265压缩。复制时间流命令_第1张图片

视频流文件是将大视频分割无数块ts分片,同时生产一个索引文件,索引文件将ts分片串联起来播放,即为视频流,那说到这里。当时有个想法,既然压缩整个视频耗时长,分成一小块一小块的压缩,应该就不会超时吧。

//ts分片压缩
$cmd = 'ffmpeg  -i  video3/video-000.ts -c:v libx264 -c:a aac -copyts -strict -2 video3/yasuo.ts -y';
exec($cmd,$ary,$state);
var_dump($ary);
echo $state;

事实证明此方法可行。

-c:v libx264:复制视频流,一定要加

-c:a aac:复制音频流,一定要加,不加的话,声音会链接不上,造成部分音频丢失。

-copyts:复制时间流,这个很重,查阅很多资料才找到的复制时间流命令,主要功能是将ts分片保留原先时间流,保证和m3u8索引文件里面记录的分割时间一致。如果不在加这个,播放视频的时候,会卡顿,ts分片加载不准确。

你可能感兴趣的:(FFmpeg,php)