.avimp4v-->.mp4一、編碼MJPG、后綴.aviMJPG是大寫!!!#coding=utf-8from__future__importabsolute_import,division,print_functionimportcv2importwarningsimportnumpyasnp" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python OpenCV 寫入視頻

系統(tǒng) 2266 0

其實(shí)OpenCV已經(jīng)提供了寫視頻的接口,但是編碼和文件后綴的對應(yīng)真是讓人頭疼,動不動就不支持。經(jīng)過嘗試,總結(jié)出目前兩種可以正常寫入視頻的對應(yīng)關(guān)系:

  1. MJPG --> .avi
  2. mp4v -->.mp4

一、編碼MJPG、后綴.avi

MJPG是大寫!!!

            
              
                # coding=utf-8
              
              
                from
              
               __future__ 
              
                import
              
               absolute_import
              
                ,
              
               division
              
                ,
              
               print_function

              
                import
              
               cv2

              
                import
              
               warnings

              
                import
              
               numpy 
              
                as
              
               np
warnings
              
                .
              
              simplefilter
              
                (
              
              
                "always"
              
              
                )
              
              
                class
              
              
                VideoWriter
              
              
                :
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                ,
              
               name
              
                ,
              
               width
              
                ,
              
               height
              
                ,
              
               fps
              
                =
              
              
                25
              
              
                )
              
              
                :
              
              
                # type: (str, int, int, int) -> None
              
              
                if
              
              
                not
              
               name
              
                .
              
              endswith
              
                (
              
              
                '.avi'
              
              
                )
              
              
                :
              
              
                # 保證文件名的后綴是.avi
              
              
            name 
              
                +=
              
              
                '.avi'
              
              
            warnings
              
                .
              
              warn
              
                (
              
              
                'video name should ends with ".avi"'
              
              
                )
              
              
        self
              
                .
              
              __name 
              
                =
              
               name          
              
                # 文件名
              
              
        self
              
                .
              
              __height 
              
                =
              
               height      
              
                # 高
              
              
        self
              
                .
              
              __width 
              
                =
              
               width        
              
                # 寬
              
              
        fourcc 
              
                =
              
               cv2
              
                .
              
              VideoWriter_fourcc
              
                (
              
              
                *
              
              
                'MJPG'
              
              
                )
              
              
                # 如果是avi視頻,編碼需要為MJPG
              
              
        self
              
                .
              
              __writer 
              
                =
              
               cv2
              
                .
              
              VideoWriter
              
                (
              
              name
              
                ,
              
               fourcc
              
                ,
              
               fps
              
                ,
              
              
                (
              
              width
              
                ,
              
               height
              
                )
              
              
                )
              
              
                def
              
              
                write
              
              
                (
              
              self
              
                ,
              
               frame
              
                )
              
              
                :
              
              
                if
              
               frame
              
                .
              
              dtype 
              
                !=
              
               np
              
                .
              
              uint8
              
                :
              
              
                # 檢查frame的類型
              
              
                raise
              
               ValueError
              
                (
              
              
                'frame.dtype should be np.uint8'
              
              
                )
              
              
                # 檢查frame的大小
              
              
        row
              
                ,
              
               col
              
                ,
              
               _ 
              
                =
              
               frame
              
                .
              
              shape
        
              
                if
              
               row 
              
                !=
              
               self
              
                .
              
              __height 
              
                or
              
               col 
              
                !=
              
               self
              
                .
              
              __width
              
                :
              
              
            warnings
              
                .
              
              warn
              
                (
              
              
                '長和寬不等于創(chuàng)建視頻寫入時的設(shè)置,此frame不會被寫入視頻'
              
              
                )
              
              
                return
              
              
        self
              
                .
              
              __writer
              
                .
              
              write
              
                (
              
              frame
              
                )
              
              
                def
              
              
                close
              
              
                (
              
              self
              
                )
              
              
                :
              
              
        self
              
                .
              
              __writer
              
                .
              
              release
              
                (
              
              
                )
              
              
                def
              
              
                main
              
              
                (
              
              
                )
              
              
                :
              
              
    width 
              
                =
              
              
                512
              
              
    height 
              
                =
              
              
                256
              
              
    vw 
              
                =
              
               VideoWriter
              
                (
              
              
                'test.avi'
              
              
                ,
              
               width
              
                ,
              
               height
              
                )
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                25
              
              
                *
              
              
                50
              
              
                )
              
              
                :
              
              
                # 隨機(jī)生成一幅圖像
              
              
        frame 
              
                =
              
               np
              
                .
              
              random
              
                .
              
              randint
              
                (
              
              
                0
              
              
                ,
              
              
                255
              
              
                ,
              
              
                (
              
              height
              
                ,
              
               width
              
                ,
              
              
                3
              
              
                )
              
              
                ,
              
               dtype
              
                =
              
              np
              
                .
              
              uint8
              
                )
              
              
                # 寫入圖像
              
              
        vw
              
                .
              
              write
              
                (
              
              frame
              
                )
              
              
                # 關(guān)閉
              
              
    vw
              
                .
              
              close
              
                (
              
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                '__main__'
              
              
                :
              
              
    main
              
                (
              
              
                )
              
            
          

二、編碼mp4v、后綴.mp4

mp4v是小寫!!!

            
              
                # coding=utf-8
              
              
                from
              
               __future__ 
              
                import
              
               absolute_import
              
                ,
              
               division
              
                ,
              
               print_function

              
                import
              
               cv2

              
                import
              
               warnings

              
                import
              
               numpy 
              
                as
              
               np
warnings
              
                .
              
              simplefilter
              
                (
              
              
                "always"
              
              
                )
              
              
                class
              
              
                VideoWriter
              
              
                :
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                ,
              
               name
              
                ,
              
               width
              
                ,
              
               height
              
                ,
              
               fps
              
                =
              
              
                25
              
              
                )
              
              
                :
              
              
                # type: (str, int, int, int) -> None
              
              
                if
              
              
                not
              
               name
              
                .
              
              endswith
              
                (
              
              
                '.mp4'
              
              
                )
              
              
                :
              
              
                # 保證文件名的后綴是.mp4
              
              
            name 
              
                +=
              
              
                '.mp4'
              
              
            warnings
              
                .
              
              warn
              
                (
              
              
                'video name should ends with ".mp4"'
              
              
                )
              
              
        self
              
                .
              
              __name 
              
                =
              
               name          
              
                # 文件名
              
              
        self
              
                .
              
              __height 
              
                =
              
               height      
              
                # 高
              
              
        self
              
                .
              
              __width 
              
                =
              
               width        
              
                # 寬
              
              
        fourcc 
              
                =
              
               cv2
              
                .
              
              VideoWriter_fourcc
              
                (
              
              
                *
              
              
                'mp4v'
              
              
                )
              
              
                # 如果是mp4視頻,編碼需要為mp4v
              
              
        self
              
                .
              
              __writer 
              
                =
              
               cv2
              
                .
              
              VideoWriter
              
                (
              
              name
              
                ,
              
               fourcc
              
                ,
              
               fps
              
                ,
              
              
                (
              
              width
              
                ,
              
               height
              
                )
              
              
                )
              
              
                def
              
              
                write
              
              
                (
              
              self
              
                ,
              
               frame
              
                )
              
              
                :
              
              
                if
              
               frame
              
                .
              
              dtype 
              
                !=
              
               np
              
                .
              
              uint8
              
                :
              
              
                # 檢查frame的類型
              
              
                raise
              
               ValueError
              
                (
              
              
                'frame.dtype should be np.uint8'
              
              
                )
              
              
                # 檢查frame的大小
              
              
        row
              
                ,
              
               col
              
                ,
              
               _ 
              
                =
              
               frame
              
                .
              
              shape
        
              
                if
              
               row 
              
                !=
              
               self
              
                .
              
              __height 
              
                or
              
               col 
              
                !=
              
               self
              
                .
              
              __width
              
                :
              
              
            warnings
              
                .
              
              warn
              
                (
              
              
                '長和寬不等于創(chuàng)建視頻寫入時的設(shè)置,此frame不會被寫入視頻'
              
              
                )
              
              
                return
              
              
        self
              
                .
              
              __writer
              
                .
              
              write
              
                (
              
              frame
              
                )
              
              
                def
              
              
                close
              
              
                (
              
              self
              
                )
              
              
                :
              
              
        self
              
                .
              
              __writer
              
                .
              
              release
              
                (
              
              
                )
              
              
                def
              
              
                main
              
              
                (
              
              
                )
              
              
                :
              
              
    width 
              
                =
              
              
                512
              
              
    height 
              
                =
              
              
                256
              
              
    vw 
              
                =
              
               VideoWriter
              
                (
              
              
                'test.mp4'
              
              
                ,
              
               width
              
                ,
              
               height
              
                )
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                25
              
              
                *
              
              
                50
              
              
                )
              
              
                :
              
              
                # 隨機(jī)生成一幅圖像
              
              
        frame 
              
                =
              
               np
              
                .
              
              random
              
                .
              
              randint
              
                (
              
              
                0
              
              
                ,
              
              
                255
              
              
                ,
              
              
                (
              
              height
              
                ,
              
               width
              
                ,
              
              
                3
              
              
                )
              
              
                ,
              
               dtype
              
                =
              
              np
              
                .
              
              uint8
              
                )
              
              
                # 寫入圖像
              
              
        vw
              
                .
              
              write
              
                (
              
              frame
              
                )
              
              
                # 關(guān)閉
              
              
    vw
              
                .
              
              close
              
                (
              
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                '__main__'
              
              
                :
              
              
    main
              
                (
              
              
                )
              
            
          

三、視頻寫入失敗的原因

  1. 不支持對應(yīng)的編碼和后綴。目前我知道支持的是:
    * mp4v–>.mp4
    * MJPG–>.avi
  2. frame的值類型不是uint8。
  3. frame的高或者寬和新建cv2.VideoWriter設(shè)置的高或?qū)挷粚?yīng)。

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 瓦房店市| 万安县| 邹城市| 呈贡县| 岳普湖县| 九江市| 安陆市| 沾化县| 磐石市| 肥乡县| 潼南县| 寻乌县| 罗源县| 黔南| 弋阳县| 集安市| 云浮市| 清河县| 资兴市| 泽库县| 齐河县| 长寿区| 崇礼县| 龙海市| 兴文县| 湾仔区| 兴安盟| 南安市| 松原市| 桦南县| 金乡县| 余姚市| 龙岩市| 永清县| 崇信县| 长宁县| 盘山县| 加查县| 会同县| 元氏县| 孝昌县|