HTML5更改video的src路径后,更新后的视频宽高为0的解决方法

<video id="video4" width="100%" height="400px" src="media/1.mp4"> 
    <source type="video/mp4">
</video>

从视频列表中选择视频将video中的src进行更改后,直接获取 videoHeight、videoWidth会得到 0 值

var video4 = $("#video4").get(0);
video4.src = "media/2.mp4";
var videoHeight = video4.videoHeight;  //0
var videoWidth = video4.videoWidth;    //0

解决方法如下:
对视频更改来源或其他设置后要对视频元素进行更新,更改后需要重新加载 video 元素,在 video 元素加载完成后 (oncanplay),此时才能获取到正确的 videoHeight、videoWidth值。

var video4 = $("#video4").get(0);
video4.src = "media/2.mp4";
video4.load();
video4.oncanplay = function () {  
    var videoHeight = video4.videoHeight;  //2.mp4真实高度
    var videoWidth = video4.videoWidth;    //2.mp4真实宽度
} 
bool init(const std::string& filename, int width, int height, int fps) { if(!gst_is_initialized()) { gst_init(nullptr, nullptr); } pipeline = gst_pipeline_new("video-encoder"); src = gst_element_factory_make("appsrc", "source"); g_object_set(G_OBJECT(src), "caps", gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "BGR", NULL), NULL); // 在原有代码基础上修改 // videoconvert = gst_element_factory_make("videoconvert", "color-converter"); // gst_bin_add(GST_BIN(pipeline), videoconv); convert = gst_element_factory_make("nvvidconv", "convert"); encoder = gst_element_factory_make("omxh264enc", "encoder"); parse = gst_element_factory_make("h264parse", "parser"); muxer = gst_element_factory_make("qtmux", "muxer"); sink = gst_element_factory_make("filesink", "sink"); capsfilter = gst_element_factory_make("capsfilter", "capsfilter"); if(!pipeline || !src || !convert || !encoder || !parse || !muxer || !sink) { std::cerr << "Failed to create elements" << std::endl; return false; } g_object_set(src, "stream-type", 0, "format", GST_FORMAT_TIME, nullptr); // 配置appsrc输入能力(匹配OpenCV的BGR格式) // GstCaps *input_caps = gst_caps_new_simple("video/x-raw", // "format", G_TYPE_STRING, "BGR", // "width", G_TYPE_INT, width, // "height", G_TYPE_INT, height, // "framerate", GST_TYPE_FRACTION, fps, 1, // nullptr); // g_object_set(src, // "caps", input_caps, // "format", GST_FORMAT_TIME, // "block", TRUE, // nullptr); // gst_caps_unref(input_caps); // 配置输出分辨率和格式(NV12适合硬件编码) auto caps = gst_caps_new_simple("video/x-raw", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, fps, 1, "format", G_TYPE_STRING, "NV12", nullptr); g_object_set(src , "caps", caps, "format", GST_FORMAT_TIME, "block", TRUE, NULL); // g_object_set(capsfilter, "caps", caps, nullptr); gst_caps_unref(caps); // // 输入格式约束(接在appsrc后) // GstCaps *in_caps = gst_caps_new_simple("video/x-raw", // "format", G_TYPE_STRING, "NV12", nullptr); // g_object_set(videoconv, "caps", in_caps, NULL); // gst_caps_unref(in_caps); g_object_set(encoder, "bitrate", 1000, // "tune", 0x00000004, // zerolatency nullptr); g_object_set(sink, "location", filename.c_str(), "sync", FALSE, nullptr); gst_bin_add_many(GST_BIN(pipeline), src,convert,encoder, parse,muxer, sink, nullptr); if(!gst_element_link_many(src,convert,encoder, parse, muxer, sink, nullptr)) { std::cerr << "Failed to link elements" << std::endl; return false; } // if (convert) { // // NVIDIA硬件加速路径 // if (!gst_element_link_many( // src, videoconvert, convert, capsfilter, // encoder, parse, muxer, sink, nullptr)) // { // g_printerr("NVIDIA路径连接失败,尝试通用路径\n"); // gst_bin_remove(GST_BIN(*pipeline), convert); // } // } // 通用连接路径 // if (!gst_element_link_many( // src, videoconvert, capsfilter, // encoder, parse, muxer, sink, NULL)) // { // g_printerr("元素连接失败\n"); // return false; // } return true; } 现在出现颜色不正确,分析下问题
最新发布
06-28
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值