我正在编写一个用户可以上传.mp4视频的网站。当用户上传他的视频并将此图像写入我服务器上的.jpg或.png文件时,我想制作一个缩略图。
我遇到的问题是该文件存储在我的服务器上,但它没有被查看/看作图像文件。
这是我目前的代码。
HTML部分
<canvas id="c"></canvas>
<video id="v" controls>
<source src="/215003/1.1/videos/7/f9ed57e2b0ee1e87a4cbc17c7b743eff.mp4" type="video/mp4">
</video>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
我处理画布等的javascript部分。
document.addEventListener('DOMContentLoaded', function(){
var v = document.getElementById('v');
var canvas = document.getElementById('c');
var context = canvas.getContext('2d');
var v = document.getElementById("v");
v.addEventListener('canplay', function() {
this.currentTime = this.duration / 2;
}, false);
v.addEventListener( "loadedmetadata", function (e) {
var cw = this.videoWidth,
ch = this.videoHeight;
console.log(cw);
console.log(ch);
canvas.width = cw;
canvas.height = ch;
draw(this,context,cw,ch);
var dataURL = canvas.toDataURL('image/png');
$.ajax({
type: 'POST',
url: 'saveThumb.php',
data: 'img=' + dataURL
}).done(function(o) {
console.log(dataURL);
console.log('saved');
});
}, false );
},false);
function draw(v,c,w,h) {
c.drawImage(v,0,0,w,h);
setTimeout(draw,20,v,c,w,h);
}
用于处理数据和存储图像的PHP文件:
<?php
// requires php5
define('UPLOAD_DIR', 'img/');
$img = $_POST['img'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR . uniqid() . '.png';
$success = file_put_contents($file, $data);
print $success ? $file : 'Unable to save the file.';
?>
有人可以帮助我吗? :)
答案 0 :(得分:0)
我很少使用PHP,但我知道Base64编码中没有任何空格。并不是说它会改变任何东西,因为没有空格,但为什么第二个用加号替换空间?
至于你的问题。您需要更改用于触发帖子的事件。在有任何数据呈现框架之前会触发onloadedmetadata
。您应该使用oncanplay
,然后您将有数据要发送,但因为它是至少应该得到一个空白图像。要查看客户端上的内容,请添加&#39; image = new Image(); image.src = dataURL;&#39;然后将该图像添加到dom中,你可以看到你是否得到了你想要的而不是猜测。
除此之外,我找不到任何东西。
答案 1 :(得分:0)
我终于找到了我的错误。问题是绘制函数有一个SetTimeOut函数。所以我只是在我的服务器上写了一个黑色图像,因为DataToURL函数触发了快速。
解决方案是将draw函数之后的所有内容放在write函数中。并给该函数一个时间,以确保绘制图像。
以下是更正后的代码:
document.addEventListener('DOMContentLoaded', function(){
var v = document.getElementById('v');
var canvas = document.getElementById('c');
var context = canvas.getContext('2d');
var v = document.getElementById("v");
v.addEventListener('loadedmetadata', function() {
this.currentTime = this.duration / 3;
}, false);
v.addEventListener( "loadedmetadata", function () {
var cw = this.videoWidth;
var ch = this.videoHeight;
console.log(cw); //displaying the width of the video
console.log(ch); //displaying the height of the video
canvas.width = cw; //seting the width of the canvas
canvas.height = ch; //setting the height of the canvas
draw(this,context,cw,ch); // Drawing the image from the video onto the canvas
setTimeout(function() {
write(canvas);
}, 1000)
}, false );
},false);
function draw(v,c,w,h) {
c.drawImage(v,0,0,w,h);
setTimeout(draw,20,v,c,w,h);
}
function write(c) {
var dataURL = c.toDataURL('image/jpeg');
var image = document.createElement("img");
image.src=dataURL;
document.getElementById("placehere").appendChild(image);
$.ajax({
type: 'POST',
url: 'saveThumb.php',
data: 'img=' + dataURL
}).done(function(o) {
console.log(dataURL);
console.log('saved');
});
}