精华内容
下载资源
问答
  • 录制中转换摄像头
    千次阅读
    2020-12-29 06:16:15

    VLC是每个计算机用户都必须拥有的应用程序,它的功能不只是播放媒体文件。 以下是如何使用它来记录您的网络摄像头。

    VLC Media Player是每个Windows用户都应该安装的程序的真实瑰宝。 它最主要的特点是能够播放几乎所有您可以使用的媒体格式。 但是您可能还不知道很多其他功能。 例如,您可以录制您的桌面,将视频从一种格式转换为另一种格式。 今天,我们来看看如何使用VLC录制网络摄像头。

    首先,启动VLC并转到“视图”选项卡,然后选中“高级控件”。 这将在应用程序的左下角放置一个带有记录按钮的额外工具栏。

    接下来,转到媒体>打开捕获设备。

    现在,将捕获模式保持为“令人震惊的显示”,然后从下拉菜单中选择摄像机和音频输入设备。 在我的示例中,我将Logitech C922用于视频和音频设备。 根据您的设置,您将拥有不同的音频和视频设备,只需相应地选择正确的设备即可。

    您可能要在这里做的另一件事是选择“高级选项”按钮,然后为视频插入特定的帧速率。 通常在30fps左右的某个位置会做得很好,并且可以减小视频文件的大小。 您可能需要尝试几次才能获得所需的视频质量。

    选择了音频和视频输入设备并调整了帧频后,请低头单击“播放”按钮。

    然后,您将看到自己或在主窗口中指向相机的任何内容。 要开始录制,请单击之前添加的工具栏上的“录制”按钮。

    要停止录制,请再次按“录制”按钮或“停止”按钮以完全结束录制会话。 您将在PC上的本地“视频”文件夹中找到保存为AVI文件的录像。

    还值得注意的是,如果您计划录制语音,则可能要戴上耳机或管理音频输出设备。 否则,您将通过外部扬声器听到声音的回声。 此过程类似于录制桌面,但是您选择的是其他媒体输入设备。 而且,如果您需要其他格式的记录,也可以使用VLC转换视频。

    更多相关内容
  • 0, 0) // 将video在canvas上绘制出来 canvas.toBlob(blob => { // 将canvas转换为blob console.log(blob) }) } const updateVideo=(ctx, video , rate)=>{ ctx.drawImage(video, 0, 0, 600, 600*rate);// 使用视频...

    import {useEffect,useState} from 'react';

    export default function webrtc() {

      const [mediaStream,setmediaStream]=useState(null);

      const [Stream ,setStream]=useState(false);

      const [videoBlob,setvideoBlob]=useState(null);

      const [mediaRecorder,SetmediaRecorder]=useState(null);

      const [Type,setType]=useState(false)

        useEffect(()=>{

        },[])

          const getUserMediaStream=(constraints, cb)=>{

            let video = document.querySelector('#viodes');

            if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){

                  navigator.mediaDevices.getUserMedia({audio: true, video: { facingMode:Type?"user":"environment" }}).then((stream) => {

                      if ("srcObject" in video) {

                            video.srcObject = stream;

                            video.play();

                            // onluzhis(stream)

                            setStream(stream)

                      } else {

                          video.src = window.URL && window.URL.createObjectURL(stream) || stream;

                          console.log('第二种');

                      }

                  })

            } else if (navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {

                 // webkit内核浏览器

                  if (navigator.mediaDevices === undefined) {

                    navigator.mediaDevices = {};

                  }

                  console.log('我是webkit内核');

            }

         }

         const onClickzp= ()=>{

            const viodes = document.getElementById('viodes')

            const canvas = document.getElementById('canvas')  // canvas元素

            const context = canvas.getContext('2d')

            context.drawImage(viodes, 0, 0) // 将video在canvas上绘制出来

            canvas.toBlob(blob => {   // 将canvas转换为blob

                console.log(blob)

            })

         }

        const updateVideo=(ctx, video , rate)=>{

          ctx.drawImage(video, 0, 0, 600, 600*rate);// 使用视频帧(当前帧)绘制canvas

          video.requestVideoFrameCallback( updateVideo );

       }

    const onluzhis= ()=>{

            let options = {

              audioBitsPerSecond: 128000,

              videoBitsPerSecond: 2500000,

              mimeType: "video/webm;codecs=vp8,opus"//webm类型一定要加codecs=vp8,opus,否则会导致录制时候时而可以用时而不能用

          }

          let recorder = new MediaRecorder(Stream,options);

            SetmediaRecorder(recorder)

            recorder.ondataavailable = function(evt) {

                window.bobals = new Blob([evt.data], { type: evt.data.type });

                  // setvideoBlob(bobal)

              }

              recorder.start();

              console.log('开始录制');

    }

    const endsTartOnload = ()=>{

         mediaRecorder.stop();

         setTimeout(function(){

          console.log("录像上传",window.bobals);

          let blob = new Blob([window.bobals]);

          let downloadElement = document.createElement("a");

          let href = window.URL.createObjectURL(blob); //创建下载的链接

          downloadElement.href = href;

           downloadElement.download =  formatDateTime(new Date())+'.webm'; //下载后文件名

          document.body.appendChild(downloadElement);

          downloadElement.click(); //点击下载

          document.body.removeChild(downloadElement); //下载完成移除元素

          window.URL.revokeObjectURL(href); //释放掉blob对象

        },1000);

    }

    let formatDateTime = function (date) {

            var y = date.getFullYear();

            var m = date.getMonth() + 1;//注意这个“+1”

            m = m < 10 ? ('0' + m) : m;

            var d = date.getDate();

            d = d < 10 ? ('0' + d) : d;

            var h = date.getHours();

            h=h < 10 ? ('0' + h) : h;

            var minute = date.getMinutes();

            minute = minute < 10 ? ('0' + minute) : minute;

            var second=date.getSeconds();

            second=second < 10 ? ('0' + second) : second;

            return y+'-'+m+'-'+d+' '+h+':'+minute+':'+second;

    };

    const qiehuan=()=>{

        setType(!Type)

        stopCapture()

    }

    const stopCapture=()=>{

      var video = document.getElementById('viodes');

      if (!video.srcObject) return

      let stream = video.srcObject

      let tracks = stream.getTracks();

      tracks.forEach(track => {

          track.stop()

          getUserMediaStream()

      })

    }

      return (

        <div className='webrtc'>

            <div className='tops'>

                <video  id='viodes'></video>

                <canvas id="canvas"></canvas>

            </div>

            <div>当前摄像头:{Type?'前置':'后置'}</div>

              <div className='buttons'>

                <button onClick={getUserMediaStream}>获取摄像头</button>

                <button onClick={onClickzp}>点击抓拍</button>

                <button onClick={onluzhis}>点击录制</button>

                <button onClick={endsTartOnload}>结束录制并且下载视频</button>

                <button   onClick={qiehuan}>切换摄像头</button>

              </div>

        </div>

      )

    }

    展开全文
  • 本demo自定义控件实现视频录制,可切换摄像头,记录录制时间,测试录制一分钟小于5M。
  • 支持x86和ARM平台的USB摄像头视频采集,根据自己的摄像头设备节点、分辨率修改代码,运行时需要一些库的支持,同时需要注意如果运行缺少某些库时需要软链接进入相应的目录
  • 按帧录制本机摄像头视频(边预览边录制) 运行例子 首先下载例子代码 git clone https://github.com/mymagicpower/AIAS.git 导入examples项目到IDE: cd live_stream_sdks/camera2mp4_sdk 运行例子代码:...

    按帧录制本机摄像头视频(边预览边录制)
    result

    运行例子

    1. 首先下载例子代码
    git clone https://github.com/mymagicpower/AIAS.git
    
    1. 导入examples项目到IDE中:
    cd live_stream_sdks/camera2mp4_sdk
    
    1. 运行例子代码:Camera2MP4
    package me.aias.example;
    
    import org.bytedeco.javacv.*;
    import org.bytedeco.javacv.FrameRecorder.Exception;
    import org.bytedeco.opencv.opencv_core.IplImage;
    
    import javax.swing.*;
    import java.util.EnumSet;
    
    /**
     * 按帧录制本机摄像头视频(边预览边录制)
     *
     * @author Calvin
     */
    public class Camera2MP4 {
    
        public static void main(String[] args)
                throws Exception,
                FrameGrabber.Exception {
            // audioChannel用于控制是否录制音频(0:不录制/1:录制)
            // 录制1分钟视频
            recordCamera("build/output/camera.mp4", 1, 1);
        }
    
        /**
         * 按帧录制本机摄像头视频(边预览边录制)
         *
         * @param outputFile -录制的文件路径
         * @throws Exception
         * @throws Exception
         */
        public static void recordCamera(String outputFile, int audioChannel, float mins)
                throws FrameGrabber.Exception, Exception {
            // 本机摄像头默认0
            try (FrameGrabber grabber = FrameGrabber.createDefault(0)) {
                // 开启抓取器
                grabber.start();
    
                // 转换器
                OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
                // 抓取一帧视频,用于获取高度/宽度
                Frame grabFrame = null;
                while ((grabFrame = grabber.grab()) != null) {
                    EnumSet<Frame.Type> videoOrAudio = grabFrame.getTypes();
                    if (videoOrAudio.contains(Frame.Type.VIDEO)) {
                        break;
                    }
                }
    
                IplImage grabbedImage = converter.convert(grabFrame);
                int width = grabbedImage.width();
                int height = grabbedImage.height();
    
                // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
                try (FFmpegFrameRecorder recorder =
                             new FFmpegFrameRecorder(outputFile, width, height, audioChannel)) {
                    recorder.start(); // 开启录制器
                    CanvasFrame canvasFrame =
                            new CanvasFrame("Camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());
                    canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    canvasFrame.setAlwaysOnTop(true);
    
                    //获取当前系统时间
                    long startTime = System.currentTimeMillis();
    
                    while (canvasFrame.isVisible() && (grabFrame = grabber.grab()) != null) {
                        EnumSet<Frame.Type> videoOrAudio = grabFrame.getTypes();
                        if (videoOrAudio.contains(Frame.Type.VIDEO)) {
                            canvasFrame.showImage(grabFrame);
                        }
                        recorder.record(grabFrame);
    
                        //获取当前的系统时间,与初始时间相减就是程序运行的毫秒数,除以1000就是秒数
                        long endTime = System.currentTimeMillis();
                        long usedTime = (endTime - startTime) / 1000;
                        if (usedTime > mins * 60) break;
                    }
                    // 关闭窗口
                    canvasFrame.dispose();
                }
            }
        }
    }
    
    

    效果如下:

    录制视频保存于

    build/output/camera.mp4
    

    目录:

    http://www.aias.top/

    Git地址:

    https://github.com/mymagicpower/AIAS
    https://gitee.com/mymagicpower/AIAS

    展开全文
  • 通过 web 录制视频(摄像头)并上传

    千次阅读 2021-04-27 10:55:45
    想通过 web 录制视频,并将视频上传到后端要怎么实现呢? 2.整体思路 打开摄像头 :MediaDevices.getUserMedia() 录制:使用 MediaRecorder 内存存储:创建一个 [] 数组,存放字节,再转成 blob 对象。 上传:构建...

    1.背景

    想通过 web 录制视频,并将视频上传到后端要怎么实现呢?

    2.整体思路

    • 打开摄像头 :MediaDevices.getUserMedia()
    • 录制:使用 MediaRecorder
    • 内存存储:创建一个 [] 数组,存放字节,再转成 blob 对象。
    • 上传:构建file,再到 formData,使用ajax发起HTTP 请求

    3.实现方式

    获得摄像头设备

    MediaDevices 接口提供访问连接媒体输入的设备,如照相机和麦克风,以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。

    **MediaDevices.getUserMedia()** 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D转换器等等),也可能是其它轨道类型。

    在用户通过提示允许的情况下,打开系统上的相机或屏幕共享和/或麦克风,并提供 MediaStream 包含视频轨道和/或音频轨道的输入。

    MediaStream 接口是一个媒体内容的流.。一个流包含几个轨道,比如视频和音频轨道。

    录制

    MediaRecorder() 构造函数会创建一个对指定的 MediaStream 进行录制的 MediaRecorder 对象

    var mediaRecorder = new MediaRecorder(stream[, options]);

    ...
    
    
    if (navigator.mediaDevices.getUserMedia) {
      var constraints = { audio: true, video: true };
      var chunks = [];
    
      var onSuccess = function(stream) {
        var options = {
          audioBitsPerSecond : 128000,
          videoBitsPerSecond : 2500000,
          mimeType : 'video/mp4'
        }
        var mediaRecorder = new MediaRecorder(stream,options);
        m = mediaRecorder;
    
    ...

    获得录制过程中的 数据

    MediaRecorder.ondataavailable 调用它用来处理 dataavailable 事件, 该事件可用于获取录制的媒体资源 (在事件的 data 属性中会提供一个可用的 Blob 对象.)

    //  当停止录像以后的回调函数
          _mediaRecorder.ondataavailable = function (data) {
              console.log("# 产生录制数据...");
              console.log(data);
              console.log("# ondataavailable, size = " + parseInt(data.size/1024) + "KB");
              _chunks.push(data);
          };
          _mediaRecorder.onstop = function(e) {
              console.log("# 录制终止 ...");
              const fullBlob = new Blob(_chunks);
              const blobURL = window.URL.createObjectURL(fullBlob);
              console.log("blob is ?, size="+parseInt(fullBlob.size/1024)+"KB. "); console.log(fullBlob);
              console.log("blobURL =" + blobURL);
              //saveFile(blobURL);
              uploadFile(fullBlob);
            }

    从 blob 转成 file

    方法: var myFile = new File(bits, name[, options]);
    参数说明:
    bits: 一个包含ArrayBuffer,ArrayBufferView,Blob,或者 DOMString 对象的 Array — 或者任何这些对象的组合。这是 UTF-8 编码的文件内容。
    name: USVString,表示文件名称,或者文件路径。

    示例:

    var file = new File(["foo"], "foo.txt", {
      type: "text/plain",
    });

    保存文件 到本地文件

    生成一个 A 标签,赋值 href 和 download 属性即可。

    // 保存文件(产生下载的效果)
        let saveFile = function(blob){
          const link = document.createElement('a');
          link.style.display = 'none';
          link.href = blob;
          link.download = 'media_.mp4';
          document.body.appendChild(link);
          link.click();
          link.remove();
        }

    上传到后端服务

    • 创建file对象: file = new File([blob], "media_.mp4");
    • 构建成 fromData: var formData = new FormData();
    • 再 Ajax 上传即可。
    let uploadFile = function(blob){
          var file = new File([blob], "media_.mp4");
          var formData = new FormData();
          formData.append('file', file);
          console.log(formData);
          console.log("# 准备上传, fileName="+file.name +", size="+ parseInt(file.size/1024)+" KB");
          let $output = $("#output");
          $.ajax({
              type:"POST",
              url: "/uploadvideo",
              data: formData,
              processData: false,
              contentType: false,
              success:function (){
                 $output.prepend("上传视频成功!");
               },
              error : function() {
                $output.prepend("上传视频失败!");
              }
           });
        }

    判断其 MIME 格式能否被客户端录制

    MediaRecorder.isTypeSupported()方法会判断其 MIME 格式能否被客户端录制。

    var canRecord = MediaRecorder.isTypeSupported(mimeType)

    "video/webm",
                 "audio/webm",
                 "video/webm\;codecs=vp8",
                 "video/webm\;codecs=daala",
                 "video/webm\;codecs=h264",
                 "audio/webm\;codecs=opus",
                 "video/mpeg"

    关闭视频流

    遍历 _mediaStream ,终止所有的 track 即可。

    // 关闭流
        var closeMediaStream = function(){
          if(!_mediaStream) return;
          console.log("# 关闭数据流");
          _mediaStream.getTracks().forEach(function (track) {
            track.stop();
          });
          _mediaStream = undefined;
          _mediaRecorder = undefined;
        }

    后端代码:接收视频文件

    创建一个 controller ,接收 MultipartFile 参数,保存文件流即可。

    /**
     * @description:
     * @author: zhangyunfei
     * @date: 2021/4/25 19:22
     */
    @RestController
    @RequestMapping()
    public class UploadFileController {
        public static final String IMAGE_STORE_DIR = "/Users/zhangyunfei/git/demo/video2/public";
        private static final String TAG = UploadFileController.class.getSimpleName();
    
    
        @PostMapping(value = "/uploadvideo", name = "接收上传文件")
        public String uploadVideo(@RequestParam("file") MultipartFile uploadFile) {
            String name = uploadFile.getOriginalFilename();
            String size = String.format("%.2f MB", uploadFile.getSize() / 1024f / 1024f);
            System.out.println(String.format("# name=%s, size=%s", name, size));
            saveFile(uploadFile);
            return "ok";
        }
    
        private void saveFile(MultipartFile uploadFile) {
            try {
                String fileName = UUID.randomUUID().toString() + ".mp4";
                File path = new File(IMAGE_STORE_DIR, fileName);
                uploadFile.transferTo(path);
                LogUtil.d(TAG, "## 保存文件成功,路径=%s", path.getPath());
            } catch (IOException e) {
                e.printStackTrace();
                LogUtil.d(TAG, "## 保存文件失败,%s", e);
            }
        }
    
    }

    后端设置:修改最大上传文件大小和请求大小。

    需要修改最大上传文件大小和请求大小,不然默认的 1MB是不够用的。

    也很简单,修改配置文件即可。

    spring:
        servlet:
            multipart:
                max-file-size: 50MB  #单个数据大小
                max-request-size: 100MB #总数据大小

    4.我的示例

    示例指南见:https://www.jianshu.com/p/052a7fecc358
    代码在 github: https://github.com/vir56k/demo/tree/master/video2

    5.参考

    Web API 接口参考https://developer.mozilla.org/zh-CN/docs/Web/API

    参考视频示例:https://www.jianshu.com/p/052a7fecc358https://wendychengc.github.io/media-recorder-video-canvas/videocanvas.html

    https://cloud.tencent.com/developer/article/1366886

    https://segmentfault.com/q/1010000011489899

    http://www.zuidaima.com/blog/3819727543307264.htm

    展开全文
  • 系统录制 Intent intent=new Intent(MediaStore.ACTION_VIDEO_CAPTURE); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,0); intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT,10485760L); //android 5.0 无效 ...
  • 有人会回答吗…
  • PC端调用摄像头录制视频——vue标准写法

    千次阅读 热门讨论 2021-04-06 22:04:32
    客户端——录制视频之“行”在PC端调用摄像头录制视频,传给后端生成链接。实现步骤:上代码(代码及属性介绍): 在PC端调用摄像头录制视频,传给后端生成链接。 说说最近做的这个功能的需求,就是简单的在PC端调起...
  • 敬告:该系列的课程在抓紧录制更新,敬请大家关注。 敬告:本课程项目仅供学习参考,请不要直接商用,概不负责任何法律责任。  该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流...
  • Snatch 是 HQ 桌面/屏幕录像机、网络摄像头查看器、MP3 媒体播放器和文件转换器以及收音机(流接收器/录像机)。 一个简单的 CPU 友好、不引人注目的应用程序。 专为游戏、桌面/屏幕和音频录制而创建,重点强调适用...
  • 关于视频捕捉、录制、切换摄像头在上一篇博客有详细的讲解(https://blog.csdn.net/s12117719679/article/details/100513400), 这里就不做过多解析 聚焦的关键代码如下: 点击手势,根据点击的位置转换成相机...
  • 这种类型的功能,正如预期的那样,与网络摄像头和音频录制功能一起打包。视频和/或音频内容(使用该工具上传或录制)以后可以被编辑、裁剪、压缩,并以大量不同的格式输出,而用户总是有可能选择最终产品的质量和/或...
  • 6.android手机录制出来的视频是旋转了90度的,如何实现旋转(转换到前置摄像头又如何处理) 7.视频旋转、利用图片合成视频、使用本地视频剪辑、后期视频特效添加等等 这里只是解决了1、2、3、4、5、6。7如果有人知道...
  • 海康威视格式转换工具是一款非常简单易用的由海康威视官方推出的媒体格式转换工具,海康威视格式转换工具支持目前海康设备码流和录像文件的预览、分析并按照用户设定的参数转码,需要此款工具的朋友们就来下载使用吧...
  • IOS-摄像头采集-录制

    千次阅读 2018-09-11 11:29:02
    iOS视频录制功能预研  丨n水瓶座菜虫灬 关注 2017.10.13 14:12* 字数 3394 阅读 159评论 0喜欢 4 ...特点: 可用于从相簿选取照片、拍照、录制视频,使用简便,提供的配置有录制视频的质量、前后...
  • args) { } /** * 按帧录制本机摄像头视频(边预览边录制,停止预览即停止录制) * * @param outputFile -录制的文件路径,也可以是rtsp或者rtmp等流媒体服务器发布地址 * @param frameRate - 视频帧率 * @throws ...
  • SoundPool的用法在Android播放音频文件一般都使用MediaPlayer,但是一般都是比较长的音频文件,我们可以用soundpool可以播一些短的反应速度要求高的声音,比如通知提示音,消息提示音等。特点 SoundPool载入音乐...
  • FFmpeg是一套可以用来记录、转换数字...它提供了录制转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
  • (PS:目前相册选择照片和调用摄像头拍照已经实现了压缩,录制小视频暂未实现,哪位大佬有好的建议,请指教!) 实现步骤: 1.新建一个AndroidStudio项目。绘制MainActivity的xml文件,这里为了直观,我们放上几个...
  • 1.获取摄像头的数据 2.把获取到的数据保存到视频文件 3.录制音频,并和视频合并 4.录制视频时如何实现暂停功能 ...6.android手机录制出来的视频是旋转了90度的,如何实现旋转(转换到前置摄像头又如何处理)
  • 之前写过一篇文章,实时展示摄像头内容 有提到过一种实时展示摄像头内容的方式:集成ffmpeg相关的代码,并转换成图片传给web界面进行相应的展示,现补充下具体的实现。 ffmpeg简介 ffmpeg是一套可以用来记录、转换...
  • 目标:打开摄像头并捕获照片播放本地视频,录制视频OpenCV函数:cv2.VideoCapture(),cv2.VideoWriter()教程打开摄像头要使用摄像头,需要使用cv2.VideoCapture(0)创建VideoCapture对象,参数:0指的是摄像头的编号。...
  • 摄像头软件的工作原理,是将摄像头、数码相机、电视卡等硬件终端输入的模拟信号,通过模拟、数字转换程序,转换成二进制数字信号,并按数字视频各格式编码规范进行播放 CYS多功能摄像头管理工具截图
  • 公司需要双摄像头录制 demo却不太对 弄得 双摄像头切换识别人脸的demo
  • 学术会议演讲视频录制全方位指南

    千次阅读 2021-05-29 10:26:52
    一般的要求就是录制一个15分钟左右的Presentation,然后上传至网站即可。有些会议还贴心的准备了加载字幕的功能,我们的英语水平基本都是有自知之明的,所以如果想让别人更好的理解我们的想法,建议增加手工字幕...
  • 以达到录制画的效果,Apowersoft录屏王可以帮助用户完整录制指定活动桌面的一切内容,并将录制好的视频转换成为WMV、AVI、MP4、MOV、MKV、FLV、MPEG、VOB、WEBM及其它多种不同视频格式,同时录制屏幕画面及系统/...
  • 最近手边的零食总是莫名其妙的减少,为了抓到一个元凶来帮我续零食,就想着使用手边的usb摄像头来实现一个动态物体监测和保存视频的功能,不过这里使用最简单的帧差法来实现物体的运动监测。 2、使用OpenCV的帧差法...
  • 好久没更新博客了,最近在交毕设的材料耽搁了学习的时间,今天继续开始进行音视频学习的记录,上次利用rtmp进行推流完成了一个基本的流媒体直播,这次要利用本地的摄像头采集视频帧然后利用rtmp将采集到的视频上传到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,143
精华内容 2,457
热门标签
关键字:

录制中转换摄像头