javascript - 将图像从视频 JS 保存到画布
问题描述
当我尝试从刚刚创建的视频中捕获帧时出现错误。在drawImage之后:
无法在“CanvasRenderingContext2D”上执行“drawImage”:提供的值不是类型“(CSSImageValue 或 HTMLImageElement 或 SVGImageElement 或 HTMLVideoElement 或 HTMLCanvasElement 或 ImageBitmap 或 OffscreenCanvas)”
知道可能是什么原因吗?谢谢
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
var $theImg = $('<video id="video" preload="metadata" src="http://localhost/screens/page/VIDEO/vids/' + file.name + '"></video>');
$theImg.attr('data-disp', name);
$theImg.attr('data-name', file.name);
$theImg.attr('data-created', 1);
$theImg.appendTo('#selectable-videos');
$theImg.addClass('selectable-image');
$(e.target).parent().parent().find('.modal-body').children().append($theImg);
var $canvas = $('<canvas id="canvas" width="640" height="480"></canvas>');
$theImg.append($canvas);
var canvas = $('#canvas');
var video = $('#video');
if (video.length) {
var ctx = canvas[0].getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
//convert to desired file format
var dataURI = canvas.toDataURL('image/jpeg'); // can also use 'image/png'
解决方案
您正在证明 jQuery 对象drawImage()
,而不是本机 Element 对象。您可以使用[0]
或get(0)
从 jQuery 对象中检索第一个底层元素:
var ctx = canvas[0].getContext('2d').drawImage(video[0], 0, 0, canvas.width, canvas.height);
toDataURL()
另请注意,当您在画布上调用时,您将在下一行遇到类似的问题。
var dataURI = canvas[0].toDataURL('image/jpeg');
请注意,可以整理逻辑,因为使用包含不同对象类型的相似变量名有点令人困惑。尝试这个:
var $video = $('<video></video>', {
id: 'video',
preload: 'metadata',
src: 'http://localhost/screens/page/VIDEO/vids/' + file.name,
data - disp: name,
data - name: file.name,
data - created: 1,
class: 'selectable-image'
}).appendTo('#selectable-videos');
// is this line really needed? You just appended it above.
// also, use closest() instead of parent().parent().parent()...
$(e.target).parent().parent().find('.modal-body').children().append($video);
var $canvas = $('<canvas></canvas>', {
id: 'canvas',
width: 640,
height: 480
}).appendTo($video);
var canvas = $canvas[0];
var video = $video[0];
// removed 'if' check - you just created the element, it will exist
var ctx = canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
var dataURI = canvas.toDataURL('image/jpeg');
最后,您将 a 附加canvas
到video
元素是非常奇怪的。我建议不要那样做。
推荐阅读
- xml - 提交站点地图时如何解决 Google 搜索控制台中的 424 http 错误?
- node.js - NodeJS Redis (ioredis) hgetall 抛出未定义的错误
- ruby-on-rails - “物化”:找不到
- here-api - 这里 Waypoint Sequencing API 不支持交付窗口
- python - Python:将 Argparse.parseargs 获取为原始字符串
- typescript - TypeScript 泛型映射可变元组值到嵌套映射类型
- sql-server - SQL Server:结合日期列和时间列,插入到日期时间列
- android-studio - 当它说“帧不可用于未挂起的线程”时,如何在不停止进程的情况下恢复调试器
- sql-server - 如何使用 TypeORM Query Builder 转换字符串的查询“WHERE IN”?
- java - javax.jcr.RepositoryException 试图遵循 Adobe 示例