Vue3+TS 视频播放器组件封装(Video.js + Hls.js 最佳组合,从零基础到精通,收藏这篇就够了!

.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.markdown-body pre,.markdown-body pre>code.hljs{background:#1c1d21;color:#c0c5ce}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}

📺 前端开发者必看!2025年最全视频播放器终极指南:6大热门工具深度横评+实战避坑指南


🔥 为什么你需要这篇指南?

作为前端开发者,你是否遇到过这些问题:

  • 播放器在不同浏览器疯狂报错?
  • HLS/DASH流媒体加载卡成PPT?
  • 弹幕功能实现耗费两周还掉头发?
  • 老板突然要求支持8K HDR却不知从何下手?

本文为你带来六大主流播放器深度解剖,从底层原理到实战技巧,一次性解决所有视频播放难题!


🎮 六大播放器功能天梯图(2024版)

播放器核心定位协议支持杀手锏功能适用场景
Video.js全能老将HLS/DASH/MP4/FLV700+插件生态企业级复杂项目
Hls.jsHLS救星HLS(TS分片)破解Safari垄断直播/点播网站
DPlayer二次元福音MP4/FLV/WebTorrent弹幕系统开箱即用弹幕视频网站
Plyr颜值担当HTML5标准格式无障碍支持+响应式美学品牌官网/教育平台
ReactPlayerReact生态专属全协议通吃声明式API+SSR友好React技术栈项目
JW Player商业王者DRM/HLS/DASH/IMA广告企业级监控系统大型流媒体平台

💻 格式支持生死战

1. MP4

  • 全支持,但注意H.264专利陷阱
  • 最佳实践:使用videojs-contrib-hls解决老版本IE兼容

2. HLS (m3u8+TS)

  • Hls.js:通过MSE在Chrome/Firefox实现解码
  • 避坑指南:iOS强制使用原生播放器

3. DASH

  • Video.js + dash.js组合技
  • 黑科技:自适应码率算法优化

4. FLV

  • DPlayer + flv.js黄金搭档
  • 性能预警:CPU解码消耗较大

🔧 核心问题解决矩阵

痛点解决方案技术原理揭秘
Safari HLS垄断Hls.js模拟MSE管道将TS流实时转封装为fMP4
弹幕卡顿WebGL渲染+轨道分层算法独立合成层避免重绘
首屏加载慢分片预加载+Range请求优化HTTP/2多路复用传输
4K卡顿WASM SIMD解码加速多线程FFmpeg编译
DRM版权保护Widevine+硬件级解密TEE可信执行环境

🚨 血泪教训——开发者必知的5大陷阱

  1. iOS静音策略:自动播放必须添加muted属性
  2. 内存泄漏重灾区:Hls.js实例必须手动销毁
  3. 字幕编码坑:UTF-8 with BOM是万恶之源
  4. 跨域危机:CORS配置错误导致MP4无法seek
  5. 广告黑屏:IMA SDK需要动态加载证书链

🌟 最佳实践清单

场景1:企业官网宣传视频

  • 选型:Plyr + WebM VP9

  • 配置:```

    
    
    

场景2:直播平台

  • 选型:Video.js + Hls.js

  • 秘技:```
    // 开启硬件加速
    video.style.transform = ‘translateZ(0)’;
    // 关键帧预加载
    hls.config.maxBufferLength = 30;

    
    
    

场景3:二次元弹幕站

  • 选型:DPlayer + WebSocket

  • 优化:```
    // 弹幕轨道分区
    danmaku: {
    channels: {
    top: 3, // 顶部3轨道
    bottom: 2 // 底部2轨道
    }
    }

    
    
    

🔮 未来趋势预警

  1. WebCodecs API:直接操作媒体帧的革命
  2. WebTransport:替代WebSocket的下一代传输协议
  3. AV1编码:Chrome 90+默认支持的次世代格式
  4. WebGPU渲染:3D弹幕/VR视频的新可能

🔧 技术栈搭配推荐

- 中小企业标配:Plyr + Vimeo CDN  
- 高并发直播:Video.js + Wowza引擎  
- 黑科技实验室:WebCodecs + WebGPU  

掌握播放器核心技术,从此告别视频需求焦虑!💪

Video.js + Hls.js 最佳组合

基于上述分析,我选择 Video.js + Hls.js 作为基础技术栈,这是目前最稳定且功能全面的组合:

  • Video.js:提供强大的插件生态和全面的协议支持
  • Hls.js:解决HLS跨浏览器兼容问题
  • Vue3 Composition API:更清晰的逻辑组织和生命周期管理

1. 组件目录结构

/components
  /VideoPlayer
    index.ts            # 导出组件
    VideoPlayer.vue     # 主组件(script setup版本)
    types.ts            # 类型定义
    useVideoPlayer.ts   # 组合式函数
    utils.ts            # 工具函数
    default-options.ts  # 默认配置

2. 核心代码实现

types.ts

// 播放器配置类型定义
export interface VideoPlayerOptions {
  autoplay?: boolean;          // 是否自动播放
  muted?: boolean;             // 是否静音
  loop?: boolean;              // 是否循环播放
  controls?: boolean;          // 是否显示控制栏
  preload?: 'auto' | 'metadata' | 'none';  // 预加载策略
  fluid?: boolean;             // 是否自适应容器
  aspectRatio?: string;        // 宽高比,如"16:9"
  poster?: string;             // 封面图片URL
  sources: VideoSource[];      // 视频源列表
  hlsConfig?: Record<string, any>; // HLS配置选项
  plugins?: Record<string, any>;   // 插件配置
}

// 视频源定义
export interface VideoSource {
  src: string;  // 视频URL
  type: 'video/mp4' | 'application/x-mpegURL' | 'video/webm' | 'video/ogg' | 'application/dash+xml'; // 媒体类型
  size?: number; // 清晰度,如720, 1080等
}

// 播放器事件回调定义
export interface VideoPlayerEvents {
  onReady?: (player: any) => void;        // 播放器就绪
  onPlay?: (event: any) => void;          // 开始播放
  onPause?: (event: any) => void;         // 暂停播放
  onEnded?: (event: any) => void;         // 播放结束
  onError?: (error: any) => void;         // 播放错误
  onTimeUpdate?: (event: any) => void;    // 时间更新
  onSeeking?: (event: any) => void;       // 开始跳转
  onSeeked?: (event: any) => void;        // 跳转完成
  onQualityChanged?: (quality: number) => void; // 清晰度切换
}

// videojs实例类型
export type VideoPlayerInstance = any;

default-options.ts

import { VideoPlayerOptions } from './types';

// 播放器默认配置
export const defaultOptions: Partial<VideoPlayerOptions> = {
  autoplay: false,       // 默认不自动播放
  muted: false,          // 默认不静音
  loop: false,           // 默认不循环
  controls: true,        // 默认显示控制栏
  preload: 'auto',       // 默认预加载策略
  fluid: true,           // 默认自适应容器
  aspectRatio: '16:9',   // 默认宽高比
  
  // 播放器技术优先级
  techOrder: ['html5'],
  
  // 语言设置
  language: 'zh-CN',
  
  // 控制栏配置
  controlBar: {
    playToggle: true,              // 播放/暂停按钮
    currentTimeDisplay: true,      // 当前时间
    timeDivider: true,             // 时间分隔符
    durationDisplay: true,         // 总时长
    progressControl: true,         // 进度条
    volumePanel: {
      inline: false,               // 音量控制是否内联
    },
    fullscreenToggle: true,        // 全屏按钮
  },
  
  // HLS默认配置
  hlsConfig: {
    enableWorker: true,           // 启用WebWorker
    lowLatencyMode: false,        // 低延迟模式
    backBufferLength: 90,         // 后退缓冲区长度
    maxBufferLength: 30,          // 最大缓冲长度
  }
};

utils.ts

/**
 * 检测是否为移动设备
 * @returns 是否为移动设备
 */
export const isMobile = (): boolean => {
  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
};

/**
 * 检测视频格式
 * @param url 视频URL
 * @returns 格式标识符
 */
export const detectFormat = (url: string): string => {
  if (url.includes('.m3u8')) return 'hls';
  if (url.includes('.mpd')) return 'dash';
  if (url.includes('.mp4')) return 'mp4';
  if (url.includes('.webm')) return 'webm';
  if (url.includes('.flv')) return 'flv';
  return 'unknown';
};

/**
 * 检测浏览器是否支持HLS
 * @returns 是否支持HLS
 */
export const isHlsSupported = (): boolean => {
  const video = document.createElement('video');
  return Boolean(
    video.canPlayType('application/vnd.apple.mpegurl') || 
    (typeof Hls !== 'undefined' && Hls.isSupported())
  );
};

/**
 * 检测浏览器是否支持DASH
 * @returns 是否支持DASH
 */
export const isDashSupported = (): boolean => {
  const video = document.createElement('video');
  return Boolean(
    video.canPlayType('application/dash+xml') ||
    (typeof MediaSource !== 'undefined' && MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'))
  );
};

/**
 * 格式化时间
 * @param seconds 秒数
 * @returns 格式化后的时间字符串
 */
export const formatTime = (seconds: number): string => {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.floor(seconds % 60);
  
  return [
    hours > 0 ? hours : null,
    minutes < 10 && hours > 0 ? `0${minutes}` : minutes,
    secs < 10 ? `0${secs}` : secs
  ]
    .filter(Boolean)
    .join(':');
};

/**
 * 获取最佳视频质量
 * @param sources 视频源列表
 * @param isHighSpeed 是否高速网络
 * @returns 最合适的视频源
 */
export const getBestQuality = (sources: any[], isHighSpeed = true): any => {
  const sortedSources = [...sources].sort((a, b) => (b.size || 0) - (a.size || 0));
  
  if (isHighSpeed) {
    // 高速网络返回最高质量
    return sortedSources[0];
  } else {
    // 低速网络返回中等质量
    const midIndex = Math.floor(sortedSources.length / 2);
    return sortedSources[midIndex] || sortedSources[0];
  }
};

VideoPlayer.vue (Script Setup版本)

<template>
  <div class="vue-video-player-container" :style="containerStyle">
    <video
      ref="videoRef"
      class="video-js vjs-big-play-centered"
      :class="playerClass"
      :poster="options.poster"
    ></video>
  </div>
</template>

<script setup lang="ts">
import { ref, computed, onMounted, onBeforeUnmount, watch, nextTick } from 'vue';
import videojs from 'video.js';
import 'video.js/dist/video-js.css';
import Hls from 'hls.js';
import { VideoPlayerOptions, VideoPlayerEvents, VideoSource } from './types';
import { defaultOptions } from './default-options';
import { isMobile, detectFormat, isHlsSupported, isDashSupported } from './utils';

// 定义组件属性
interface Props {
  options: VideoPlayerOptions;            // 播放器配置
  events?: VideoPlayerEvents;             // 事件处理函数
  responsive?: boolean;                   // 是否响应式
  playerClass?: string;                   // 播放器自定义类名
}

// 组件事件
const emits = defineEmits<{
  (e: 'ready', player: any): void;
  (e: 'play', event: any): void;
  (e: 'pause', event: any): void;
  (e: 'ended', event: any): void;
  (e: 'error', error: any): void;
  (e: 'timeupdate', event: any): void;
  (e: 'quality-changed', quality: number): void;
}>();

// 使用withDefaults设置属性默认值
const props = withDefaults(defineProps<Props>(), {
  events: () => ({}),
  responsive: true,
  playerClass: ''
});

// 响应式状态
const videoRef = ref<HTMLVideoElement | null>(null);
const player = ref<any>(null);
const hls = ref<Hls | null>(null);
const currentQuality = ref<number>(0);

// 计算属性:容器样式
const containerStyle = computed(() => ({
  width: props.responsive ? '100%' : undefined,
  position: 'relative' as const,
  overflow: 'hidden' as const,
}));

/**
 * 初始化播放器
 */
const initializePlayer = () => {
  if (!videoRef.value) return;

  // 合并默认配置
  const finalOptions = {
    ...defaultOptions,
    ...props.options,
    // iOS需要特殊处理
    playsinline: true,
    // 移动设备处理
    inactivityTimeout: isMobile() ? 3000 : 2000,
  };

  // 创建Video.js实例
  player.value = videojs(videoRef.value, finalOptions, function() {
    // 播放器就绪
    emits('ready', player.value);
    if (props.events?.onReady) props.events.onReady(player.value);
  });

  // 注册事件处理
  registerEvents();
  
  // 处理HLS格式
  setupHlsSupport();
  
  // 处理自适应码率
  setupQualityControl();
  
  // 性能优化
  applyPerformanceOptimizations();
};

/**
 * 注册事件监听
 */
const registerEvents = () => {
  if (!player.value) return;
  
  const eventsMap = [
    { name: 'play', handler: props.events?.onPlay, emit: 'play' },
    { name: 'pause', handler: props.events?.onPause, emit: 'pause' },
    { name: 'ended', handler: props.events?.onEnded, emit: 'ended' },
    { name: 'error', handler: props.events?.onError, emit: 'error' },
    { name: 'timeupdate', handler: props.events?.onTimeUpdate, emit: 'timeupdate' },
    { name: 'seeking', handler: props.events?.onSeeking },
    { name: 'seeked', handler: props.events?.onSeeked },
  ];
  
  eventsMap.forEach(event => {
    player.value.on(event.name, (e: any) => {
      if (event.handler) event.handler(e);
      if (event.emit) emits(event.emit as any, e);
    });
  });
};

/**
 * 设置HLS支持
 */
const setupHlsSupport = () => {
  if (!player.value) return;
  
  const hlsSource = props.options.sources.find(
    source => source.type === 'application/x-mpegURL'
  );
  
  if (!hlsSource) return;
  
  // 如果浏览器原生支持HLS,使用原生支持
  if (videoRef.value?.canPlayType('application/vnd.apple.mpegurl')) {
    player.value.src(hlsSource.src);
    return;
  }
  
  // 否则使用Hls.js
  if (Hls.isSupported()) {
    // 销毁已存在的Hls实例
    if (hls.value) {
      hls.value.destroy();
    }
    
    hls.value = new Hls({
      maxBufferLength: 30,
      maxMaxBufferLength: 60,
      ...props.options.hlsConfig,
    });
    
    hls.value.loadSource(hlsSource.src);
    hls.value.attachMedia(videoRef.value as HTMLVideoElement);
    
    // 错误处理
    hls.value.on(Hls.Events.ERROR, function(event, data) {
      if (data.fatal) {
        switch(data.type) {
          case Hls.ErrorTypes.NETWORK_ERROR:
            // 尝试恢复网络错误
            hls.value?.startLoad();
            break;
          case Hls.ErrorTypes.MEDIA_ERROR:
            // 尝试恢复媒体错误
            hls.value?.recoverMediaError();
            break;
          default:
            // 无法恢复的错误
            destroyPlayer();
            break;
        }
        
        emits('error', data);
        if (props.events?.onError) props.events.onError(data);
      }
    });
  }
};

/**
 * 设置清晰度切换
 */
const setupQualityControl = () => {
  if (!player.value || !props.options.sources || props.options.sources.length <= 1) return;
  
  // 如果有多个清晰度源
  if (props.options.sources.filter(s => s.size).length > 1) {
    const qualities = props.options.sources
      .filter(s => s.size)
      .sort((a, b) => (b.size || 0) - (a.size || 0));
      
    // 创建分辨率菜单
    const qualityMenu = player.value.controlBar.addChild('MenuButton', {
      controlText: '清晰度',
      menuButton: true,
    });
    
    // 添加清晰度选项
    qualities.forEach((quality, index) => {
      qualityMenu.addChild('MenuItem', {
        label: `${quality.size}p`,
        selected: index === 0,
        handleClick: () => {
          // 切换清晰度
          const currentTime = player.value.currentTime();
          const isPaused = player.value.paused();
          
          player.value.src({ src: quality.src, type: quality.type });
          player.value.load();
          player.value.currentTime(currentTime);
          
          if (!isPaused) {
            player.value.play();
          }
          
          currentQuality.value = index;
          emits('quality-changed', quality.size || 0);
          if (props.events?.onQualityChanged) {
            props.events.onQualityChanged(quality.size || 0);
          }
        }
      });
    });
  }
};

/**
 * 应用性能优化
 */
const applyPerformanceOptimizations = () => {
  if (!videoRef.value || !player.value) return;
  
  // 开启硬件加速
  videoRef.value.style.transform = 'translateZ(0)';
  
  // 预加载下一帧
  if (props.options.preload !== 'none') {
    player.value.preload('auto');
  }
  
  // 如果是移动设备,降低初始化清晰度
  if (isMobile() && props.options.sources.length > 1) {
    const lowestQuality = [...props.options.sources]
      .filter(s => s.size)
      .sort((a, b) => (a.size || 0) - (b.size || 0))[0];
      
    if (lowestQuality) {
      player.value.src({ src: lowestQuality.src, type: lowestQuality.type });
    }
  }
  
  // 监听网络状况,动态调整缓冲策略
  if (navigator.connection) {
    const connection = navigator.connection as any;
    if (connection.addEventListener) {
      connection.addEventListener('change', () => {
        if (connection.effectiveType === '4g') {
          // 高速连接,预加载更多
          if (hls.value) {
            hls.value.config.maxBufferLength = 60;
          }
        } else if (connection.effectiveType === '3g' || connection.effectiveType === '2g') {
          // 低速连接,减少预加载
          if (hls.value) {
            hls.value.config.maxBufferLength = 15;
          }
        }
      });
    }
  }
};

/**
 * 清理资源
 */
const destroyPlayer = () => {
  if (hls.value) {
    hls.value.destroy();
    hls.value = null;
  }
  
  if (player.value) {
    player.value.dispose();
    player.value = null;
  }
};

// 监听配置变化
watch(() => props.options.sources, () => {
  if (player.value) {
    destroyPlayer();
    nextTick(initializePlayer);
  }
}, { deep: true });

// 生命周期钩子
onMounted(() => {
  initializePlayer();
});

onBeforeUnmount(() => {
  destroyPlayer();
});

// 暴露方法和属性给父组件
defineExpose({
  player,
  videoRef,
  destroyPlayer
});
</script>

<style scoped>
.vue-video-player-container {
  margin: 0 auto;
  position: relative;
  overflow: hidden;
}

:deep(.video-js) {
  width: 100%;
  height: 100%;
}

:deep(.vjs-fullscreen) {
  background-color: #000;
}

/* 自定义控制栏样式 */
:deep(.vjs-control-bar) {
  background-color: rgba(0, 0, 0, 0.7);
}

/* 移动端优化 */
@media (max-width: 768px) {
  :deep(.vjs-big-play-button) {
    transform: scale(0.8);
  }
  
  :deep(.vjs-control-bar) {
    font-size: 0.9em;
  }
}
</style>

useVideoPlayer.ts

import { ref, Ref, onMounted, onBeforeUnmount, watch } from 'vue';
import videojs from 'video.js';
import Hls from 'hls.js';
import { VideoPlayerOptions, VideoPlayerInstance } from './types';
import { defaultOptions } from './default-options';

/**
 * 视频播放器组合式API
 * @param options 播放器配置选项
 * @param elementRef DOM元素引用
 * @returns 播放器控制对象
 */
export const useVideoPlayer = (
  options: VideoPlayerOptions,
  elementRef: Ref<HTMLElement | null>
) => {
  const player: Ref<VideoPlayerInstance | null> = ref(null);
  const hls: Ref<Hls | null> = ref(null);
  const isReady = ref(false);
  const isPlaying = ref(false);
  const currentTime = ref(0);
  const duration = ref(0);
  const loadedPercent = ref(0);
  const error = ref<any>(null);

  /**
   * 初始化播放器
   */
  const initialize = () => {
    if (!elementRef.value) return;
    
    const finalOptions = { ...defaultOptions, ...options };
    
    // 创建播放器实例
    player.value = videojs(elementRef.value, finalOptions);
    
    // 事件监听
    player.value.on('ready', () => {
      isReady.value = true;
    });
    
    player.value.on('play', () => {
      isPlaying.value = true;
    });
    
    player.value.on('pause', () => {
      isPlaying.value = false;
    });
    
    player.value.on('timeupdate', () => {
      if (player.value) {
        currentTime.value = player.value.currentTime();
      }
    });
    
    player.value.on('loadedmetadata', () => {
      if (player.value) {
        duration.value = player.value.duration();
      }
    });
    
    player.value.on('progress', () => {
      if (player.value) {
        const buffered = player.value.buffered();
        if (buffered && buffered.length > 0) {
          loadedPercent.value = buffered.end(0) / duration.value;
        }
      }
    });
    
    player.value.on('error', (e) => {
      error.value = e;
    });

    // 初始化HLS(如果需要)
    initializeHls();
  };

  /**
   * 初始化HLS
   */
  const initializeHls = () => {
    if (!player.value) return;

    const hlsSource = options.sources.find(
      source => source.type === 'application/x-mpegURL'
    );
    
    if (!hlsSource) return;
    
    const video = player.value.el().querySelector('video');
    
    if (!video) return;
    
    // 检查是否原生支持HLS
    if (video.canPlayType('application/vnd.apple.mpegurl')) {
      player.value.src(hlsSource.src);
      return;
    }
    
    // 使用Hls.js
    if (Hls.isSupported()) {
      hls.value = new Hls(options.hlsConfig);
      hls.value.loadSource(hlsSource.src);
      hls.value.attachMedia(video);
      
      hls.value.on(Hls.Events.MANIFEST_PARSED, () => {
        if (options.autoplay) {
          player.value?.play();
        }
      });
      
      hls.value.on(Hls.Events.ERROR, (event, data) => {
        if (data.fatal) {
          switch(data.type) {
            case Hls.ErrorTypes.NETWORK_ERROR:
              hls.value?.startLoad();
              break;
            case Hls.ErrorTypes.MEDIA_ERROR:
              hls.value?.recoverMediaError();
              break;
            default:
              destroy();
              break;
          }
        }
      });
    }
  };

  /**
   * 播放方法
   */
  const play = async () => {
    try {
      if (player.value) {
        await player.value.play();
      }
    } catch (e) {
      console.error('无法自动播放:', e);
    }
  };

  /**
   * 暂停方法
   */
  const pause = () => {
    if (player.value) {
      player.value.pause();
    }
  };

  /**
   * 跳转方法
   * @param time 目标时间(秒)
   */
  const seek = (time: number) => {
    if (player.value) {
      player.value.currentTime(time);
    }
  };

  /**
   * 设置音量
   * @param volume 音量(0-1)
   */
  const setVolume = (volume: number) => {
    if (player.value) {
      player.value.volume(volume);
    }
  };

  /**
   * 切换静音
   */
  const toggleMute = () => {
    if (player.value) {
      player.value.muted(!player.value.muted());
    }
  };

  /**
   * 进入/退出全屏
   */
  const toggleFullscreen = () => {
    if (player.value) {
      if (player.value.isFullscreen()) {
        player.value.exitFullscreen();
      } else {
        player.value.requestFullscreen();
      }
    }
  };

  /**
   * 销毁播放器
   */
  const destroy = () => {
    if (hls.value) {
      hls.value.destroy();
      hls.value = null;
    }
    
    if (player.value) {
      player.value.dispose();
      player.value = null;
    }
    
    isReady.value = false;
    isPlaying.value = false;
    currentTime.value = 0;
    duration.value = 0;
    loadedPercent.value = 0;
    error.value = null;
  };

  // 监视配置变化
  watch(() => options.sources, () => {
    if (player.value) {
      destroy();
      initialize();
    }
  }, { deep: true });

  // 生命周期钩子
  onMounted(initialize);
  onBeforeUnmount(destroy);

  return {
    player,
    isReady,
    isPlaying,
    currentTime,
    duration,
    loadedPercent,
    error,
    play,
    pause,
    seek,
    setVolume,
    toggleMute,
    toggleFullscreen,
    destroy
  };
};

index.ts

import VideoPlayer from './VideoPlayer.vue';
import { useVideoPlayer } from './useVideoPlayer';
import type { VideoPlayerOptions, VideoPlayerEvents, VideoSource } from './types';

export { VideoPlayer, useVideoPlayer, VideoPlayerOptions, VideoPlayerEvents, VideoSource };
export default VideoPlayer;

3. 使用示例

基础调用方式

<template>
  <!-- 最简单的基础调用 -->
  <VideoPlayer :options="videoOptions" />
</template>

<script setup lang="ts">
import { VideoPlayer } from '@/components/VideoPlayer';
import type { VideoPlayerOptions } from '@/components/VideoPlayer';

// 基础配置
const videoOptions: VideoPlayerOptions = {
  controls: true,
  poster: '/poster.jpg',
  sources: [
    {
      src: 'https://example.com/video.mp4',
      type: 'video/mp4'
    }
  ]
};
</script>

完整调用方式

<template>
  <div class="player-wrapper">
    <h2>{{ title }}</h2>
    
    <!-- 完整配置的播放器 -->
    <VideoPlayer
      ref="playerRef"
      :options="videoOptions"
      :events="videoEvents"
      :responsive="true"
      playerClass="my-custom-player"
      @ready="onPlayerReady"
      @play="onPlay"
      @pause="onPause" 
      @ended="onEnded"
      @error="onPlayerError"
      @timeupdate="onTimeUpdate"
      @quality-changed="onQualityChanged"
    />
    
    <!-- 自定义控制区域 -->
    <div class="custom-controls">
      <div class="time-display">{{ formatTime(currentTime) }} / {{ formatTime(duration) }}</div>
      
      <button @click="togglePlayback" class="control-btn">
        {{ isPlaying ? '暂停' : '播放' }}
      </button>
      
      <button @click="toggleMute" class="control-btn">
        {{ isMuted ? '取消静音' : '静音' }}
      </button>
      
      <button @click="rewind10" class="control-btn">
        -10秒
      </button>
      
      <button @click="forward10" class="control-btn">
        +10秒
      </button>
      
      <button @click="toggleFullscreen" class="control-btn">
        全屏
      </button>
      
      <!-- 清晰度选择 -->
      <div class="quality-selector">
        <span>清晰度:</span>
        <select v-model="selectedQuality" @change="changeQuality">
          <option v-for="source in qualitySources" :key="source.size" :value="source.size">
            {{ source.size }}p
          </option>
        </select>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive, computed, onMounted } from 'vue';
import { VideoPlayer } from '@/components/VideoPlayer';
import type { VideoPlayerOptions, VideoPlayerEvents, VideoSource } from '@/components/VideoPlayer';
import { formatTime } from '@/components/VideoPlayer/utils';

// 标题
const title = ref('高清视频播放器示例');

// 播放器引用
const playerRef = ref<InstanceType<typeof VideoPlayer> | null>(null);

// 播放器状态
const isPlaying = ref(false);
const isMuted = ref(false);
const currentTime = ref(0);
const duration = ref(0);
const selectedQuality = ref(720);

// 提取所有带有尺寸的视频源
const qualitySources = computed(() => {
  return videoOptions.sources.filter(source => source.size).sort((a, b) => (b.size || 0) - (a.size || 0));
});

// 播放器配置
const videoOptions: VideoPlayerOptions = reactive({
  // 基础设置
  autoplay: false,
  muted: false,
  loop: false,
  controls: true,
  fluid: true,
  poster: 'https://example.com/poster.jpg',
  
  // 视频源列表(包含多种格式和清晰度)
  sources: [
    // HLS流(自适应清晰度)
    {
      src: 'https://example.com/video/master.m3u8',
      type: 'application/x-mpegURL',
    },
    // 不同清晰度的MP4
    {
      src: 'https://example.com/video/1080p.mp4',
      type: 'video/mp4',
      size: 1080
    },
    {
      src: 'https://example.com/video/720p.mp4',
      type: 'video/mp4',
      size: 720
    },
    {
      src: 'https://example.com/video/480p.mp4',
      type: 'video/mp4',
      size: 480
    },
    // WebM格式(用于兼容性)
    {
      src: 'https://example.com/video/720p.webm',
      type: 'video/webm',
      size: 720
    }
  ],
  
  // HLS特定配置
  hlsConfig: {
    maxBufferLength: 30,
    maxMaxBufferLength: 60,
    enableWorker: true,
    lowLatencyMode: false,
  }
});

// 播放器事件处理
const videoEvents: VideoPlayerEvents = {
  onReady: (player) => {
    console.log('播放器初始化完成', player);
    // 可以在这里对player进行进一步配置
  },
  
  onPlay: (event) => {
    console.log('开始播放', event);
    isPlaying.value = true;
  },
  
  onPause: (event) => {
    console.log('暂停播放', event);
    isPlaying.value = false;
  },
  
  onEnded: (event) => {
    console.log('播放结束', event);
    isPlaying.value = false;
  },
  
  onError: (error) => {
    console.error('播放出错', error);
    // 可以在这里添加错误恢复逻辑
  },
  
  onTimeUpdate: (event) => {
    // 更新当前播放时间
    if (playerRef.value?.player) {
      currentTime.value = playerRef.value.player.currentTime();
    }
  },
  
  onQualityChanged: (quality) => {
    console.log(`切换到${quality}p清晰度`);
    selectedQuality.value = quality;
  },
};

// 事件处理函数
const onPlayerReady = (player: any) => {
  console.log('播放器就绪');
  
  // 获取视频时长
  duration.value = player.duration();
  
  // 预加载元数据
  player.preload('metadata');
  
  // 添加键盘快捷键
  document.addEventListener('keydown', handleKeyboardControls);
};

const onPlay = (event: any) => {
  console.log('播放事件', event);
  isPlaying.value = true;
};

const onPause = (event: any) => {
  console.log('暂停事件', event);
  isPlaying.value = false;
};

const onEnded = (event: any) => {
  console.log('结束事件', event);
  isPlaying.value = false;
};

const onTimeUpdate = (event: any) => {
  // 更新进度信息
  if (playerRef.value?.player) {
    currentTime.value = playerRef.value.player.currentTime();
  }
};

const onPlayerError = (error: any) => {
  console.error('播放器错误:', error);
  // 显示用户友好的错误消息
};

const onQualityChanged = (quality: number) => {
  console.log(`画质已切换到: ${quality}p`);
  selectedQuality.value = quality;
};

// 自定义控制方法
const togglePlayback = () => {
  if (!playerRef.value?.player) return;
  
  if (isPlaying.value) {
    playerRef.value.player.pause();
  } else {
    playerRef.value.player.play();
  }
};

const toggleMute = () => {
  if (!playerRef.value?.player) return;
  
  const player = playerRef.value.player;
  player.muted(!player.muted());
  isMuted.value = player.muted();
};

const rewind10 = () => {
  if (!playerRef.value?.player) return;
  
  const player = playerRef.value.player;
  const newTime = Math.max(player.currentTime() - 10, 0);
  player.currentTime(newTime);
};

const forward10 = () => {
  if (!playerRef.value?.player) return;
  
  const player = playerRef.value.player;
  const newTime = Math.min(player.currentTime() + 10, player.duration());
  player.currentTime(newTime);
};

const toggleFullscreen = () => {
  if (!playerRef.value?.player) return;
  
  const player = playerRef.value.player;
  if (player.isFullscreen()) {
    player.exitFullscreen();
  } else {
    player.requestFullscreen();
  }
};

// 质量切换
const changeQuality = () => {
  if (!playerRef.value?.player) return;
  
  const player = playerRef.value.player;
  const currentTime = player.currentTime();
  const isPaused = player.paused();
  
  // 寻找选定清晰度的源
  const selectedSource = videoOptions.sources.find(source => source.size === selectedQuality.value);
  
  if (selectedSource) {
    // 切换视频源
    player.src({ src: selectedSource.src, type: selectedSource.type });
    player.load();
    
    // 恢复播放位置
    player.one('loadedmetadata', () => {
      player.currentTime(currentTime);
      
      // 如果之前在播放,继续播放
      if (!isPaused) {
        player.play();
      }
    });
  }
};

// 键盘控制
const handleKeyboardControls = (e: KeyboardEvent) => {
  if (!playerRef.value?.player) return;
  
  const player = playerRef.value.player;
  
  switch(e.key) {
    case ' ':  // 空格键
      togglePlayback();
      e.preventDefault();
      break;
    case 'ArrowLeft':  // 左箭头
      rewind10();
      e.preventDefault();
      break;
    case 'ArrowRight':  // 右箭头
      forward10();
      e.preventDefault();
      break;
    case 'f':  // F键
      toggleFullscreen();
      e.preventDefault();
      break;
    case 'm':  // M键
      toggleMute();
      e.preventDefault();
      break;
  }
};

// 清理工作
onMounted(() => {
  // 在组件卸载时移除事件监听器
  return () => {
    document.removeEventListener('keydown', handleKeyboardControls);
  };
});
</script>

<style scoped>
.player-wrapper {
  max-width: 1000px;
  margin: 0 auto;
  padding: 20px;
}

h2 {
  text-align: center;
  margin-bottom: 20px;
}

.custom-controls {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 10px;
  margin-top: 15px;
  padding: 10px;
  background: #f5f5f5;
  border-radius: 4px;
}

.time-display {
  font-family: monospace;
  font-size: 14px;
  margin-right: 15px;
}

.control-btn {
  padding: 8px 15px;
  border-radius: 4px;
  background: #3498db;
  color: white;
  border: none;
  cursor: pointer;
  transition: background 0.3s;
}

.control-btn:hover {
  background: #2980b9;
}

.quality-selector {
  display: flex;
  align-items: center;
  gap: 5px;
}

.quality-selector select {
  padding: 5px;
  border-radius: 4px;
  border: 1px solid #ddd;
}

@media (max-width: 768px) {
  .custom-controls {
    flex-direction: column;
    gap: 8px;
  }
}
</style>

4. 组件逻辑和最佳实践总结

核心逻辑概述

  1. 组件架构

    • 使用<script setup>语法简化组件结构
    • 利用definePropsdefineEmits明确定义接口
    • 通过defineExpose暴露必要方法给父组件
  2. 播放器封装

    • 基于Video.js实现核心播放能力
    • 使用Hls.js解决HLS格式跨浏览器兼容
    • 实现自适应清晰度切换功能
  3. 性能优化

    • CSS硬件加速提高渲染性能
    • 根据网络情况动态调整缓冲
    • 移动设备自动调整初始清晰度
  4. 错误处理和恢复

    • HLS错误自动恢复机制
    • 网络错误智能重试
    • 完善的资源清理避免内存泄漏

最佳实践要点

  1. 兼容性处理

    • iOS视频播放: 添加playsinline属性
    • 自动播放: 默认添加muted属性绕过限制
    • 格式兼容: 提供多种格式回退机制
  2. 性能优化

    // 硬件加速
    videoRef.value.style.transform = 'translateZ(0)';
    
    // 移动设备降低初始清晰度
    if (isMobile() && sources.length > 1) {
      player.src({ src: lowestQuality.src, type: lowestQuality.type });
    }
    
    // 网络自适应缓冲
    if (connection.effectiveType === '4g') {
      hls.config.maxBufferLength = 60;
    } else {
      hls.config.maxBufferLength = 15;
    }
    
    
  3. 资源管理

    // 必须销毁Hls实例避免内存泄漏
    onBeforeUnmount(() => {
      if (hls.value) {
        hls.value.destroy();
        hls.value = null;
      }
      
      if (player.value) {
        player.value.dispose();
        player.value = null;
      }
    });
    
    
  4. 错误恢复策略

    hls.on(Hls.Events.ERROR, (event, data) => {
      if (data.fatal) {
        switch(data.type) {
          case Hls.ErrorTypes.NETWORK_ERROR:
            // 网络错误尝试恢复
            hls.startLoad();
            break;
          case Hls.ErrorTypes.MEDIA_ERROR:
            // 媒体错误尝试恢复
            hls.recoverMediaError();
            break;
        }
      }
    });
    
    

5. 总结

本组件实现了一个功能完善、性能优化的视频播放器,主要特点:

  • 强大格式支持:HLS/MP4/WebM等主流视频格式
  • 跨浏览器兼容:解决了iOS/Safari的HLS播放问题
  • 响应式设计:自适应不同屏幕尺寸
  • 多清晰度切换:支持流畅切换不同清晰度
  • 性能优化:硬件加速、网络感知缓冲
  • 类型安全:完整的TypeScript类型定义

相比原始HTML5 video标签,此组件解决了各平台兼容性问题并提供了更友好的用户体验,适合中大型Web应用中的视频播放需求。

 ## **黑客/网络安全学习路线**

对于从来没有接触过黑客/网络安全的同学,目前网络安全、信息安全也是计算机大学生毕业薪资相对较高的学科。

大白也帮大家准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

这也是耗费了大白近四个月的时间,吐血整理,文章非常非常长,觉得有用的话,希望粉丝朋友帮忙点个**「分享」「收藏」「在看」「赞」**

网络安全/渗透测试法律法规必知必会****

今天大白就帮想学黑客/网络安全技术的朋友们入门必须先了解法律法律。

【网络安全零基础入门必知必会】网络安全行业分析报告(01)

【网络安全零基础入门必知必会】什么是黑客、白客、红客、极客、脚本小子?(02)

【网络安全零基础入门必知必会】网络安全市场分类(03)

【网络安全零基础入门必知必会】常见的网站攻击方式(04)

【网络安全零基础入门必知必会】网络安全专业术语全面解析(05)

【网络安全入门必知必会】《中华人民共和国网络安全法》(06)

【网络安全零基础入门必知必会】《计算机信息系统安全保护条例》(07)

【网络安全零基础入门必知必会】《中国计算机信息网络国际联网管理暂行规定》(08)

【网络安全零基础入门必知必会】《计算机信息网络国际互联网安全保护管理办法》(09)

【网络安全零基础入门必知必会】《互联网信息服务管理办法》(10)

【网络安全零基础入门必知必会】《计算机信息系统安全专用产品检测和销售许可证管理办法》(11)

【网络安全零基础入门必知必会】《通信网络安全防护管理办法》(12)

【网络安全零基础入门必知必会】《中华人民共和国国家安全法》(13)

【网络安全零基础入门必知必会】《中华人民共和国数据安全法》(14)

【网络安全零基础入门必知必会】《中华人民共和国个人信息保护法》(15)

【网络安全零基础入门必知必会】《网络产品安全漏洞管理规定》(16)

网络安全/渗透测试linux入门必知必会

【网络安全零基础入门必知必会】什么是Linux?Linux系统的组成与版本?什么是命令(01)

【网络安全零基础入门必知必会】VMware下载安装,使用VMware新建虚拟机,远程管理工具(02)

【网络安全零基础入门必知必会】VMware常用操作指南(非常详细)零基础入门到精通,收藏这一篇就够了(03)

【网络安全零基础入门必知必会】CentOS7安装流程步骤教程(非常详细)零基入门到精通,收藏这一篇就够了(04)

【网络安全零基础入门必知必会】Linux系统目录结构详细介绍(05)

【网络安全零基础入门必知必会】Linux 命令大全(非常详细)零基础入门到精通,收藏这一篇就够了(06)

【网络安全零基础入门必知必会】linux安全加固(非常详细)零基础入门到精通,收藏这一篇就够了(07)

网络安全/渗透测试****计算机网络入门必知必会****

【网络安全零基础入门必知必会】TCP/IP协议深入解析(非常详细)零基础入门到精通,收藏这一篇就够了(01)

【网络安全零基础入门必知必会】什么是HTTP数据包&Http数据包分析(非常详细)零基础入门到精通,收藏这一篇就够了(02)

【网络安全零基础入门必知必会】计算机网络—子网划分、子网掩码和网关(非常详细)零基础入门到精通,收藏这一篇就够了(03)

网络安全/渗透测试入门之HTML入门必知必会

【网络安全零基础入门必知必会】什么是HTML&HTML基本结构&HTML基本使用(非常详细)零基础入门到精通,收藏这一篇就够了1

【网络安全零基础入门必知必会】VScode、PhpStorm的安装使用、Php的环境配置,零基础入门到精通,收藏这一篇就够了2

【网络安全零基础入门必知必会】HTML之编写登录和文件上传(非常详细)零基础入门到精通,收藏这一篇就够了3

网络安全/渗透测试入门之Javascript入门必知必会

【网络安全零基础入门必知必会】Javascript语法基础(非常详细)零基础入门到精通,收藏这一篇就够了(01)

【网络安全零基础入门必知必会】Javascript实现Post请求、Ajax请求、输出数据到页面、实现前进后退、文件上传(02)

网络安全/渗透测试入门之Shell入门必知必会

【网络安全零基础入门必知必会】Shell编程基础入门(非常详细)零基础入门到精通,收藏这一篇就够了(第七章)

网络安全/渗透测试入门之PHP入门必知必会

【网络安全零基础入门】PHP环境搭建、安装Apache、安装与配置MySQL(非常详细)零基础入门到精通,收藏这一篇就够(01)

【网络安全零基础入门】PHP基础语法(非常详细)零基础入门到精通,收藏这一篇就够了(02)

【网络安全零基础入门必知必会】PHP+Bootstrap实现表单校验功能、PHP+MYSQL实现简单的用户注册登录功能(03)

网络安全/渗透测试入门之MySQL入门必知必会

【网络安全零基础入门必知必会】MySQL数据库基础知识/安装(非常详细)零基础入门到精通,收藏这一篇就够了(01)

【网络安全零基础入门必知必会】SQL语言入门(非常详细)零基础入门到精通,收藏这一篇就够了(02)

【网络安全零基础入门必知必会】MySQL函数使用大全(非常详细)零基础入门到精通,收藏这一篇就够了(03)

【网络安全零基础入门必知必会】MySQL多表查询语法(非常详细)零基础入门到精通,收藏这一篇就够了(04)

****网络安全/渗透测试入门之Python入门必知必会

【网络安全零基础入门必知必会】之Python+Pycharm安装保姆级教程,Python环境配置使用指南,收藏这一篇就够了【1】

【网络安全零基础入门必知必会】之Python编程入门教程(非常详细)零基础入门到精通,收藏这一篇就够了(2)

python开发之手写第一个python程序

python开发笔记之变量

python基础语法特征

python开发数据类型

python开发笔记之程序交互

python入门教程之python开发学习笔记基本数据类型

python入门教程之python开发笔记之格式化输出

python入门教程之python开发笔记基本运算符

python入门教程python开发基本流程控制if … else

python入门教程之python开发笔记流程控制之循环

python入门之Pycharm开发工具的使用

python入门教程之python字符编码转换

python入门之python开发字符编码

python入门之python开发基本数据类型数字

python入门python开发基本数据类型字符串

python入门python开发基本数据类型列表

python入门python开发基本数据类型

python入门教程之python开发可变和不可变数据类型和hash

python入门教程python开发字典数据类型

python入门之python开发笔记基本数据类型集合

python开发之collections模块

python开发笔记之三元运算

【网络安全零基础入门必知必会】之10个python爬虫入门实例(非常详细)零基础入门到精通,收藏这一篇就够了(3)

****网络安全/渗透测试入门之SQL注入入门必知必会

【网络安全渗透测试零基础入门必知必会】之初识SQL注入(非常详细)零基础入门到精通,收藏这一篇就够了(1)

【网络安全渗透测试零基础入门必知必会】之SQL手工注入基础语法&工具介绍(2)

【网络安全渗透测试零基础入门必知必会】之SQL注入实战(非常详细)零基础入门到精通,收藏这一篇就够了(3)

【网络安全渗透测试零基础入门必知必会】之SQLmap安装&实战(非常详细)零基础入门到精通,收藏这一篇就够了(4)

【网络安全渗透测试零基础入门必知必会】之SQL防御(非常详细)零基础入门到精通,收藏这一篇就够了(4)

****网络安全/渗透测试入门之XSS攻击入门必知必会

【网络安全渗透测试零基础入门必知必会】之XSS攻击基本概念和原理介绍(非常详细)零基础入门到精通,收藏这一篇就够了(1)

网络安全渗透测试零基础入门必知必会】之XSS攻击获取用户cookie和用户密码(实战演示)零基础入门到精通收藏这一篇就够了(2)

【网络安全渗透测试零基础入门必知必会】之XSS攻击获取键盘记录(实战演示)零基础入门到精通收藏这一篇就够了(3)

【网络安全渗透测试零基础入门必知必会】之xss-platform平台的入门搭建(非常详细)零基础入门到精通,收藏这一篇就够了4

【网络安全渗透测试入门】之XSS漏洞检测、利用和防御机制XSS游戏(非常详细)零基础入门到精通,收藏这一篇就够了5

****网络安全/渗透测试入门文件上传攻击与防御入门必知必会

【网络安全渗透测试零基础入门必知必会】之什么是文件包含漏洞&分类(非常详细)零基础入门到精通,收藏这一篇就够了1

【网络安全渗透测试零基础入门必知必会】之cve实际漏洞案例解析(非常详细)零基础入门到精通, 收藏这一篇就够了2

【网络安全渗透测试零基础入门必知必会】之PHP伪协议精讲(文件包含漏洞)零基础入门到精通,收藏这一篇就够了3

【网络安全渗透测试零基础入门必知必会】之如何搭建 DVWA 靶场保姆级教程(非常详细)零基础入门到精通,收藏这一篇就够了4

【网络安全渗透测试零基础入门必知必会】之Web漏洞-文件包含漏洞超详细全解(附实例)5

【网络安全渗透测试零基础入门必知必会】之文件上传漏洞修复方案6

****网络安全/渗透测试入门CSRF渗透与防御必知必会

【网络安全渗透测试零基础入门必知必会】之CSRF漏洞概述和原理(非常详细)零基础入门到精通, 收藏这一篇就够了1

【网络安全渗透测试零基础入门必知必会】之CSRF攻击的危害&分类(非常详细)零基础入门到精通, 收藏这一篇就够了2

【网络安全渗透测试零基础入门必知必会】之XSS与CSRF的区别(非常详细)零基础入门到精通, 收藏这一篇就够了3

【网络安全渗透测试零基础入门必知必会】之CSRF漏洞挖掘与自动化工具(非常详细)零基础入门到精通,收藏这一篇就够了4

【网络安全渗透测试零基础入门必知必会】之CSRF请求伪造&Referer同源&置空&配合XSS&Token值校验&复用删除5

****网络安全/渗透测试入门SSRF渗透与防御必知必会

【网络安全渗透测试零基础入门必知必会】之SSRF漏洞概述及原理(非常详细)零基础入门到精通,收藏这一篇就够了 1

【网络安全渗透测试零基础入门必知必会】之SSRF相关函数和协议(非常详细)零基础入门到精通,收藏这一篇就够了2

【网络安全渗透测试零基础入门必知必会】之SSRF漏洞原理攻击与防御(非常详细)零基础入门到精通,收藏这一篇就够了3**
**

****网络安全/渗透测试入门XXE渗透与防御必知必会

【网络安全渗透测试零基础入门必知必会】之XML外部实体注入(非常详细)零基础入门到精通,收藏这一篇就够了1

网络安全渗透测试零基础入门必知必会】之XXE的攻击与危害(非常详细)零基础入门到精通,收藏这一篇就够了2

【网络安全渗透测试零基础入门必知必会】之XXE漏洞漏洞及利用方法解析(非常详细)零基础入门到精通,收藏这一篇就够了3

【网络安全渗透测试零基础入门必知必会】之微信XXE安全漏洞处理(非常详细)零基础入门到精通,收藏这一篇就够了4

****网络安全/渗透测试入门远程代码执行渗透与防御必知必会

【网络安全渗透测试零基础入门必知必会】之远程代码执行原理介绍(非常详细)零基础入门到精通,收藏这一篇就够了1

【网络安全零基础入门必知必会】之CVE-2021-4034漏洞原理解析(非常详细)零基础入门到精通,收藏这一篇就够了2

【网络安全零基础入门必知必会】之PHP远程命令执行与代码执行原理利用与常见绕过总结3

【网络安全零基础入门必知必会】之WEB安全渗透测试-pikachu&DVWA靶场搭建教程,零基础入门到精通,收藏这一篇就够了4

****网络安全/渗透测试入门反序列化渗透与防御必知必会

【网络安全零基础入门必知必会】之什么是PHP对象反序列化操作(非常详细)零基础入门到精通,收藏这一篇就够了1

【网络安全零基础渗透测试入门必知必会】之php反序列化漏洞原理解析、如何防御此漏洞?如何利用此漏洞?2

【网络安全渗透测试零基础入门必知必会】之Java 反序列化漏洞(非常详细)零基础入门到精通,收藏这一篇就够了3

【网络安全渗透测试零基础入门必知必会】之Java反序列化漏洞及实例解析(非常详细)零基础入门到精通,收藏这一篇就够了4

【网络安全渗透测试零基础入门必知必会】之CTF题目解析Java代码审计中的反序列化漏洞,以及其他漏洞的组合利用5

网络安全/渗透测试**入门逻辑漏洞必知必会**

【网络安全渗透测试零基础入门必知必会】之一文带你0基础挖到逻辑漏洞(非常详细)零基础入门到精通,收藏这一篇就够了

网络安全/渗透测试入门暴力猜解与防御必知必会

【网络安全渗透测试零基础入门必知必会】之密码安全概述(非常详细)零基础入门到精通,收藏这一篇就够了1

【网络安全渗透测试零基础入门必知必会】之什么样的密码是不安全的?(非常详细)零基础入门到精通,收藏这一篇就够了2

【网络安全渗透测试零基础入门必知必会】之密码猜解思路(非常详细)零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之利用Python暴力破解邻居家WiFi密码、压缩包密码,收藏这一篇就够了4

【网络安全渗透测试零基础入门必知必会】之BurpSuite密码爆破实例演示,零基础入门到精通,收藏这一篇就够了5

【网络安全渗透测试零基础入门必知必会】之Hydra密码爆破工具使用教程图文教程,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之暴力破解medusa,零基础入门到精通,收藏这一篇就够了7

【网络安全渗透测试零基础入门必知必会】之Metasploit抓取密码,零基础入门到精通,收藏这一篇就够了8

Wfuzz:功能强大的web漏洞挖掘工具

****网络安全/渗透测试入门掌握Redis未授权访问漏洞必知必会

【网络安全渗透测试零基础入门必知必会】之Redis未授权访问漏洞,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之Redis服务器被攻击后该如何安全加固,零基础入门到精通,收藏这一篇就够了**
**

网络安全/渗透测试入门掌握**ARP渗透与防御关必知必会**

【网络安全渗透测试零基础入门必知必会】之ARP攻击原理解析,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之ARP流量分析,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之ARP防御策略与实践指南,零基础入门到精通,收藏这一篇就够了

网络安全/渗透测试入门掌握系统权限提升渗透与防御关****必知必会

【网络安全渗透测试零基础入门必知必会】之Windows提权常用命令,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之Windows权限提升实战,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之linux 提权(非常详细)零基础入门到精通,收藏这一篇就够了

网络安全/渗透测试入门掌握Dos与DDos渗透与防御相关****必知必会

【网络安全渗透测试零基础入门必知必会】之DoS与DDoS攻击原理(非常详细)零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之Syn-Flood攻击原理解析(非常详细)零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之IP源地址欺骗与dos攻击,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之SNMP放大攻击原理及实战演示,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之NTP放大攻击原理,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之什么是CC攻击?CC攻击怎么防御?,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之如何防御DDOS的攻击?零基础入门到精通,收藏这一篇就够了

网络安全/渗透测试入门掌握无线网络安全渗透与防御相****必知必会

【网络安全渗透测试零基础入门必知必会】之Aircrack-ng详细使用安装教程,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之aircrack-ng破解wifi密码(非常详细)零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之WEB渗透近源攻击,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之无线渗透|Wi-Fi渗透思路,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之渗透WEP新思路Hirte原理解析,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之WPS的漏洞原理解析,零基础入门到精通,收藏这一篇就够了

网络安全/渗透测试入门掌握木马免杀问题与防御********必知必会

【网络安全渗透测试零基础入门必知必会】之Metasploit – 木马生成原理和方法,零基础入门到精通,收藏这篇就够了

【网络安全渗透测试零基础入门必知必会】之MSF使用教程永恒之蓝漏洞扫描与利用,收藏这一篇就够了

网络安全/渗透测试入门掌握Vulnhub靶场实战********必知必会

【网络安全渗透测试零基础入门必知必会】之Vulnhub靶机Prime使用指南,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之Vulnhub靶场Breach1.0解析,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之vulnhub靶场之DC-9,零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之Vulnhub靶机Kioptrix level-4 多种姿势渗透详解,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之Vulnhub靶场PWNOS: 2.0 多种渗透方法,收藏这一篇就够了

网络安全/渗透测试入门掌握社会工程学必知必会

【网络安全渗透测试零基础入门必知必会】之什么是社会工程学?定义、类型、攻击技术,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之社会工程学之香农-韦弗模式,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之社工学smcr通信模型,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之社会工程学之社工步骤整理(附相应工具下载)收藏这一篇就够了

网络安全/渗透测试入门掌握********渗透测试工具使用******必知必会**

2024版最新Kali Linux操作系统安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

【网络安全渗透测试零基础入门必知必会】之渗透测试工具大全之Nmap安装使用命令指南,零基础入门到精通,收藏这一篇就够了

2024版最新AWVS安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

2024版最新burpsuite安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

2024版最新owasp_zap安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

2024版最新Sqlmap安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

2024版最新Metasploit安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

2024版最新Nessus下载安装激活使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

2024版最新Wireshark安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了

觉得有用的话,希望粉丝朋友帮大白点个**「分享」「收藏」「在看」「赞」**

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

****************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 ```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值