最近做的一个项目有一个七牛云音频拼接的功能需求,但是拼接完成后会有一个延迟问题,简述为:音频A拼接音频B生产音频C,最开始,我直接将音频C覆盖音频A(这样理论上访问音频A的路径播放的是音频C),会出现音频拼接之后一段时间之内音频C并未覆盖音频A,在问了七牛云技术人员之后,提出的解决方案是,将音频C用一个新路径存放,用该方法之后,此问题得到了改善,但并未完全解决,最后通过与七牛云技术人员的沟通,得到一个解决办法,那就是用异步回调来规避七牛云未将拼接后的音频同步之前的访问,大概思路是,在提交拼接并七牛云那边同步后,七牛云会进行异步拼接结果的通知,根据七牛云的通知来对音频进行一个释放,这样就解决了音频拼接后更新不及时的问题。
拼接代码:
$config['savekey'] = str_replace(
['$(year)', '$(mon)', '$(day)', '$(hour)', '$(min)', '$(sec)', '$(etag)', '$(ext)', '$(fname)', '$(fprefix)'],
['{year}', '{mon}', '{day}', '{hour}', '{min}', '{sec}', '{filemd5}', '{.suffix}', '{filename}', '{fileprefix}'],
$config['savekey']
);
$auth = new Auth($config['accessKey'], $config['secretKey']);
$obj = new \Qiniu\Processing\PersistentFop($auth);
$image_key = ltrim(str_replace($config['cdnurl'],'',$content[0]), '/');
$fops = 'avconcat/1/format/mp3';
foreach ($content as $key => $audio){
$sound_avinfo = json_decode(file_get_contents(cdnurl($audio, true) . '?avinfo'), true); // 获取音频元信息
$sound_duration += $sound_avinfo['format']['duration'];
if($key > 0){
$as = $fops .= '/'.\Qiniu\base64_urlSafeEncode(cdnurl($audio,true));
}
}
$bucket = $config['bucket'];
$savesKeyUrl = 'uploads/'.date('Ymd').'/'.Random::alnum(32).'.mp3';
$savesKey = '/'.$savesKeyUrl;
// $fops .= '|saveas/'.\Qiniu\entry($config['bucket'], $image_key);
$fops .= '|saveas/'.\Qiniu\base64_urlSafeEncode("$bucket:$savesKeyUrl");
$a = $obj->execute($config['bucket'],$image_key,$fops,null,'回调地址',1);
接受回调:七牛云通知方式为 application/json POST 方式,可直接用 '$param = $this->request->param();' 或者 '$param = $this->request->post();' 来接收七牛云的通知数据,然后根据通知数据进行对应的操作就可以了