精华内容
下载资源
问答
  • ffmpeg标准化 使用ffmpeg批量标准化音频的实用程序。 此程序使用EBU R128响度归一化过程将媒体文件归一化为特定的响度级别。 它还可以执行基于RMS的归一化(均值被提升或衰减),或将峰归一化到某个目标水平。...
  • 环境准备 1、安装 FFmpeg 音/视频工具 FFmpeg 简易安装文档 2、安装 ffmpeg-python pip3 install ffmpeg-python 3、【可选】安装 opencv-python pip3 install opencv-python 4、【可选】安装 numpy ...
  • python 使用 ffmpeg

    2021-03-10 21:09:40
    1. 安装ffmpeg 注意:linux和windows都要在本地安装ffmpeg二进制程序,并且路径要放到Path里 linux安装命令如下: sudoadd-apt-repositoryppa:kirillshkrogalev/ffmpeg-next sudoapt-getupdate ...

    1. 安装ffmpeg

    注意:linux和windows都要在本地安装ffmpeg二进制程序,并且路径要放到Path里

    linux安装命令如下:

    • sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next  
    • sudo apt-get update  
    • sudo apt-get install ffmpeg 

    windows可从下面下载

    ffmpeg.zip

    2. 安装ffmpy

     
    1. pip install ffmpy 

    3.ffmpy的简单使用

    查看ffmpy文档

    其实就是将ffmpeg命令直接放入到ffmpy中, 并在命令行中执行代码
    ###5. python 使用ffmpy 结合ffmpeg

    import os 
    import re 
    import logging 
    from django.conf import settings 
    from django.core.cache import cache 
    from ffmpy import FFmpeg 
    from course.constant import VIDEOSTATE 
    logger = logging.getLogger(__name__) 
     
    def cut_change(video_path, out_path, out_path2, out_path3, base_path, fps_r): 
        """ 
        操作ffmpeg执行 
        :param video_path: 处理输入流视频 
        :param out_path: 合成缩略图 10×10 
        :param out_path2: 封面图路径 
        :param out_path3: 合成Ts流和 *.m3u8文件 
        :param fps_r: 对视频帧截取速度 
        """ 
        ff = FFmpeg(inputs={video_path: None}, 
                    outputs={out_path: '-f image2 -vf fpsfps=fps={},scale=180*75,tile=10x10'.format(fps_r), 
                             out_path2: '-y -f mjpeg -ss 0 -t 0.001', 
                             None: '-c copy -map 0 -y -f segment -segment_list {0} -segment_time 1  -bsf:v h264_mp4toannexb  {1}/cat_output%03d.ts'.format( 
                                 out_path3, base_path), 
                             }) 
        print(ff.cmd) 
        ff.run() 
     
     
    def execCmd(cmd): 
        """ 
        执行计算命令时间 
        """ 
        r = os.popen(cmd) 
        text = r.read().strip() 
        r.close() 
        return text 
     
     
    # 获取完整的上传文件路径 
    def has_video(video_path): 
        MEDIA_DIR = settings.MEDIA_ROOT 
        FULL_PATH = os.path.join(MEDIA_DIR, video_path) 
        flag = False 
        if os.path.exists(FULL_PATH): 
            flag = True 
        return flag, FULL_PATH, MEDIA_DIR 
     
     
    def handle_video_cut(instance): 
        video_path = instance.video.name 
        video_name = os.path.splitext(video_path.split('/')[-1])[0][:5] 
        flag, full_path, media_path = has_video(video_path) 
     
        base_preview_path = os.path.join(media_path, 'video_trans/preview') 
        base_poster_path = os.path.join(media_path, 'video_trans/poster') 
        base_path = os.path.join(media_path, 'video_trans/video_change', str(instance.id)) 
        # 必须先创建路径, ffmpeg不会自己创建 
        if not os.path.exists(base_path): 
            os.makedirs(base_path) 
        if not os.path.exists(base_poster_path): 
            os.makedirs(base_poster_path) 
        if not os.path.exists(base_preview_path): 
            os.makedirs(base_preview_path) 
        preview_path = os.path.join(base_preview_path, video_name + '{}_out.png'.format(str(instance.id))) 
        poster_path = os.path.join(base_poster_path, video_name + '{}_poster.jpeg'.format(str(instance.id))) 
        video_change = os.path.join(base_path, 'playlist.m3u8') 
     
        if not flag: 
            logger.info('this video_path({}) is not exists'.format(full_path)) 
            return None 
        cmd = "ffmpeg -i {} 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//".format(full_path) 
        text = execCmd(cmd) 
        search_group = re.search('(\d+):(\d+):(\d+)', text) 
        if search_group: 
            time_hours = int(search_group.group(1)) 
            time_minutes = int(search_group.group(2)) 
            time_seconds = int(search_group.group(3)) 
            all_count_seconds = time_hours * 60 * 60 + time_minutes * 60 + time_seconds 
            # print(all_count_seconds) 
        else: 
            logger.info('this video({}) is no time'.format(full_path)) 
            return None 
     
        # 因无法精确分配100分压缩图片,存在误差, 以下函数会有错误但是并不会影响结果, 会有exception 
        try: 
            cut_change(full_path, preview_path, poster_path, video_change, base_path, r) 
        except: 
            pass 
        # print('change video code success') 
        logger.info('change video code success and clean cache') 
        return None 

    5.编码格式的转换

    有的mp4格式编码不同, ts流切出来的视频卡顿无法播放, 需要将mp4视频的编码格式转换成 H264, 因为ffmpeg有对应的编码解析器h264_mp4toannexb,其它的编码格式例如:MPEG1, MPEG2, MPEG4等等,目前没有发现ffmpeg相对应的编码解析器,所以建议把.mp4的视频转换成h264的编解码器

     
    1. # 比如一个视频的编码是MPEG4,想用H264编码,咋办?  
    2. ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4   
    3. #input.mp4是指要转换视频的地址;output.mp4是转化后视频的存放路径  
    4. #   相反也一样  
    5. ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4 

    转换前
    在这里插入图片描述
    转换后
    在这里插入图片描述

    展开全文
  • 接上篇ffmpeg-python库的使用翻译(二) ... 现有过滤器: from __future__ import unicode_literals from .nodes import FilterNode, filter_operator from ._utils import escape_chars ...@filter_operator.

    接上篇 ffmpeg-python库的使用翻译(二)

    原文地址:https://github.com/kkroening/ffmpeg-python/blob/master/ffmpeg/_filters.py

    现有过滤器:

    from __future__ import unicode_literals
    
    from .nodes import FilterNode, filter_operator
    from ._utils import escape_chars
    
    
    @filter_operator()
    def filter_multi_output(stream_spec, filter_name, *args, **kwargs):
        """可以对一个或多个输出应用自定义过滤器.
        这与过滤器"filter"相同,除了过滤器可以产生多个输出。
        要引用输出流,请使用.stream运算符或方括号缩写:
        例如:
    
            ```
            split = ffmpeg.input('in.mp4').filter_multi_output('split')
            split0 = split.stream(0)
            split1 = split[1]
            ffmpeg.concat(split0, split1).output('out.mp4').run()
            ```
        """
        return FilterNode(
            stream_spec, filter_name, args=args, kwargs=kwargs, max_inputs=None
        )
    
    
    @filter_operator()
    def filter(stream_spec, filter_name, *args, **kwargs):
        """应用自定义过滤器。
    .
    
        ``filter_``通常由更高级别的过滤器功能使用(例如``hflip''),但是如果ffmpeg-python中缺少该过滤器,您可以直接调用filter_让ffmpeg-python传递过滤器名称,并且逐字记录ffmpeg的参数。
        
        Args:
            stream_spec: a Stream, list of Streams, or label-to-Stream dictionary mapping
            filter_name: ffmpeg filter name, e.g. `colorchannelmixer`
            *args: list of args to pass to ffmpeg verbatim
            **kwargs: list of keyword-args to pass to ffmpeg verbatim
    
        为了避免与标准python的filter函数混淆,函数名后缀有_。
    
        例如:
    
            ``ffmpeg.input('in.mp4').filter('hflip').output('out.mp4').run()``
        """
        return filter_multi_output(stream_spec, filter_name, *args, **kwargs).stream()
    
    
    @filter_operator()
    def filter_(stream_spec, filter_name, *args, **kwargs):
        """过滤器"filter"的替代名称,以免与python内置的"filter"运算符冲突。
        """
        return filter(stream_spec, filter_name, *args, **kwargs)
    
    
    @filter_operator()
    def split(stream):
        return FilterNode(stream, split.__name__)
    
    
    @filter_operator()
    def asplit(stream):
        return FilterNode(stream, asplit.__name__)
    
    
    @filter_operator()
    def setpts(stream, expr):
        """更改输入帧的PTS(演示时间戳)。
    
        Args:
            expr: The expression which is evaluated for each frame to construct its timestamp.
    
        官方文档: `setpts, asetpts <https://ffmpeg.org/ffmpeg-filters.html#setpts_002c-asetpts>`__
        """
        return FilterNode(stream, setpts.__name__, args=[expr]).stream()
    
    
    @filter_operator()
    def trim(stream, **kwargs):
        """修剪输入,以便输出包含输入的一个连续子部分。
    
        Args:
            start: 指定保留部分的开始时间,即带有时间戳开始的帧将是输出的第一帧。
            end:   指定将要删除的第一帧的时间,即紧接该帧之前的帧将是输出中的最后一帧。
            start_pts:与start相同,只是此选项以时基单位为时间戳,而不是以秒做时间戳。
            end_pts: 与end相同,只是此选项以时基单位为时间戳,而不是以秒做时间戳。
            duration: 输出的最大持续时间(以秒为单位)。
            start_frame: 输出的第一帧的编号。
            end_frame: 删除的第一帧的编号。
    
        官方文档: `trim <https://ffmpeg.org/ffmpeg-filters.html#trim>`__
        """
        return FilterNode(stream, trim.__name__, kwargs=kwargs).stream()
    
    
    @filter_operator()
    def overlay(main_parent_node, overlay_parent_node, eof_action='repeat', **kwargs):
        """将一个视频叠加在另一个视频之上。
    
        Args:
            x: 设置主视频上叠加视频的x坐标的表达式。默认值为0。
                如果表达式无效,则将其设置为一个很大的值(这意味着将不在输出可见区域内显示叠加层
                )。
            y: 设置主视频上叠加视频的y坐标的表达式。默认值为0。
                如果表达式无效,则将其设置为一个很大的值(这意味着将不在输出可见区域内显示叠加层
                )。
            eof_action: 在辅助输入上遇到EOF时采取的操作;它接受以下值:
    
                * ``repeat``: 重复最后一帧(默认)。
                * ``endall``: 结束两个流。
                * ``pass``: 通过主输入
    
            eval: 设置何时计算x和y的表达式。
                它接受以下值:
    
                * ``init``: 仅在过滤器初始化期间或在执行命令时对表达式求值一次处理
                * ``frame``: 计算每个传入帧的表达式
    
                默认值为``frame``.
           最短:如果设置为1,则在最短输入终止时强制输出终止。预设值为0。
           格式:设置输出视频的格式。
                它接受以下值:
                *``yuv420``:强制YUV420输出
                *``yuv422``:强制YUV422输出
                *``yuv444``:强制YUV444输出
                *``RGB``:强制打包RGB输出
                *``gbrp``:强制平面RGB输出
    
                默认值为``yuv420``。
            rgb(不建议使用):如果设置为1,则强制滤镜接受RGB颜色空间中的输入。预设值为0。
                不建议使用此选项,请改用format。
            repeatlast:如果设置为1,则强制滤镜在主输入上绘制最后一个覆盖帧,直到结束。
                流。值为0禁用此行为。预设值为1。
        官方文档: `overlay <https://ffmpeg.org/ffmpeg-filters.html#overlay-1>`__
        """
        kwargs['eof_action'] = eof_action
        return FilterNode(
            [main_parent_node, overlay_parent_node],
            overlay.__name__,
            kwargs=kwargs,
            max_inputs=2,
        ).stream()
    
    
    @filter_operator()
    def hflip(stream):
        """水平翻转输入视频。
    
        官方文档: `hflip <https://ffmpeg.org/ffmpeg-filters.html#hflip>`__
        """
        return FilterNode(stream, hflip.__name__).stream()
    
    
    @filter_operator()
    def vflip(stream):
        """垂直翻转输入视频。
    
        官方文档: `vflip <https://ffmpeg.org/ffmpeg-filters.html#vflip>`__
        """
        return FilterNode(stream, vflip.__name__).stream()
    
    
    @filter_operator()
    def crop(stream, x, y, width, height, **kwargs):
        """裁剪输入视频。
        Args:
            x: 在输入视频中,要输出的视频左边缘的水平位置。
            y: 在输入视频中,要输出的视频顶部边缘的垂直位置。
            width: 输出视频的宽度。必须大于0。
            heigth: 输出视频的高度。必须大于0。
    
        官方文档: `crop <https://ffmpeg.org/ffmpeg-filters.html#crop>`__
        """
        return FilterNode(
            stream, crop.__name__, args=[width, height, x, y], kwargs=kwargs
        ).stream()
    
    
    @filter_operator()
    def drawbox(stream, x, y, width, height, color, thickness=None, **kwargs):
        """在输入图像上绘制一个彩色框。
    
        Args:
            x: 该表达式指定框的左上角x坐标。默认为0。
            y: 该表达式指定框的左上角y坐标。默认为0。
            width: 指定彩色框的宽度;如果0解释为输入宽度。默认为0。
            heigth: 指定彩色框的高度;如果0解释为输入高度。默认为0。
            color: 指定要写入的框的颜色。有关此选项的常规语法,请检查“颜色”部分
                   在ffmpeg-utils手册中。如果使用特殊值反转,则框边颜色与倒亮度
                   的视频。
            thickness: The expression which sets the thickness of the box edge. Default value is 3.
            w: Alias for ``width``.
            h: Alias for ``height``.
            c: Alias for ``color``.
            t: Alias for ``thickness``.
    
        官方文档: `drawbox <https://ffmpeg.org/ffmpeg-filters.html#drawbox>`__
        """
        if thickness:
            kwargs['t'] = thickness
        return FilterNode(
            stream, drawbox.__name__, args=[x, y, width, height, color], kwargs=kwargs
        ).stream()
    
    
    @filter_operator()
    def drawtext(stream, text=None, x=0, y=0, escape_text=True, **kwargs):
        """使用libfreetype库在视频顶部的指定文件中绘制文本字符串或文本。
        要启用此过滤器的编译,您需要使用``--enable-libfreetype''配置FFmpeg。
        启用默认字体回退和字体选项,您需要使用``--enable-libfontconfig''配置FFmpeg。
        要启用text_shaping选项,您需要使用``--enable-libfribidi''配置FFmpeg。
    
        Args:
            box:用于使用背景色在文本周围绘制一个框。该值必须为1(启用)或0
                (禁用)。box的默认值为0。
            boxborderw:使用boxcolor设置要在框周围绘制边框的宽度,boxborderw默认值
                        为0。
            boxcolor:用于在文本周围绘制框的颜色。有关此选项的语法,请检查“颜色”
                      ffmpeg-utils手册中的“节”。boxcolor的默认值为“ white”。
            line_spacing:使用框设置要在框周围绘制的边框的行距(以像素为单位)。line_spacing
                          默认值为0。
            borderw:设置使用bordercolor在文本周围绘制边框的宽度。borderw默认值为0。
            bordercolor:设置用于在文本周围绘制边框的颜色。有关此选项的语法,请检查
                         ffmpeg-utils手册中的“颜色”部分。bordercolor的默认值为“ black”。
            expansion:选择文本的扩展方式。可以为none,strftime(不建议使用)或normal(默认)。
                有关详细信息,请参见下面的文本扩展部分。
            basetime:设置计数的开始时间。值以微秒为单位。仅在不建议使用的strftime中应用
                扩展模式。要在正常扩展模式下进行仿真,请使用pts函数,并提供开始时间(在
                秒)作为第二个参数。
            fix_bounds:如果为true,请检查并修复文本坐标,以避免剪切。
            fontcolor:用于绘制字体的颜色。有关此选项的语法,请检查中的“颜色”部分。
                ffmpeg-utils手册。fontcolor的默认值为“ black”。
            fontcolor_expr:字符串,其扩展方式与文本相同,以获取动态fontcolor值。默认
                此选项的值为空,不会被处理。设置此选项后,它将覆盖fontcolor选项。
            字体:用于绘制文本的字体系列。默认情况下,Sans。
            fontfile:用于绘制文本的字体文件。该路径必须包括在内。如果此参数是必需的
                fontconfig支持已禁用。
            alpha:使用alpha混合绘制文本。该值可以是0.0到1.0之间的数字。表达方式
                也接受相同的变量x,y。默认值为1。请参阅fontcolor_expr。
            fontsize:用于绘制文本的字体大小。fontsize的默认值为16。
            text_shaping:如果设置为1,则尝试对文本进行整形(例如,反转从右到左文本的顺序,然后
                绘制之前先加入阿拉伯字符)。否则,只需按照给定的文字绘制文本。默认情况下为1(如果
                支持的)。
            ft_load_flags:用于加载字体的标志。这些标志映射所支持的相应标志libfreetype是以下值
                的组合:
                * ``default``
                * ``no_scale``
                * ``no_hinting``
                * ``render``
                * ``no_bitmap``
                * ``vertical_layout``
                * ``force_autohint``
                * ``crop_bitmap``
                * ``pedantic``
                * ``ignore_global_advance_width``
                * ``no_recurse``
                * ``ignore_transform``
                * ``monochrome``
                * ``linear_design``
                * ``no_autohint``
    
                默认值为“默认”。有关更多信息,请参考FT_LOAD_ * libfreetypeflags的文档。
             
           shadowcolor:用于在绘制的文本后面绘制阴影的颜色。有关此选项的语法,
                检查ffmpeg-utils手册中的“颜色”部分。shadowcolor的默认值为“ black”。
            shadowx:相对于文本位置的文本阴影位置的x偏移量。可以是
                正值或负值。默认值为“ 0”。
            shadowy:相对于文本位置的文本阴影位置的y偏移量。可以是
                正值或负值。默认值为“ 0”。
            start_number:n / frame_num变量的起始帧号。默认值为“ 0”。
            tabsize:用于呈现选项卡的空格数的大小。预设值为4。
            timecode:以“ hh:mm:ss [:;。] ff”格式设置初始时间码表示。可以使用或不使用
                文字参数。必须指定timecode_rate选项。
            rate:设置时间码帧速率(仅时间码)。
            timecode_rate:``rate''的别名。
            r:``费率''的别名。
            tc24hmax:如果设置为1,则timecode选项的输出将在24小时后回绕。默认值为0(禁用)。
            text:要绘制的文本字符串。文本必须是UTF-8编码字符序列。该参数是
                如果未使用参数textfile指定文件,则为必需。
            textfile:包含要绘制文本的文本文件。文本必须是UTF-8编码字符序列。
                如果未使用参数text指定文本字符串,则此参数是必需的。如果文字和
                指定了文本文件,将引发错误。
            reload:如果设置为1,则文本文件将在每帧之前重新加载。请确保以原子方式进行更新,或者
                可能会被部分读取,甚至失败。
            x:该表达式指定在视频帧内绘制文本的偏移量。它相对于
                输出图像的左边框。默认值为“ 0”。
            y:该表达式指定在视频帧中将在其中绘制文本的偏移量。它相对于
                输出图像的顶部边框。默认值为“ 0”。请参阅下面的可接受常量列表
                和功能。
    
       表达式常量:
            x和y的参数是包含以下常量和函数的表达式:
             -dar:输入显示宽高比,与``[w / h)* sar''相同
             -hsub:水平色度子样本值。例如,对于像素格式“ yuv422p”,hsub为2,vsub
               是1。
             -vsub:垂直色度子样本值。例如,对于像素格式“ yuv422p”,hsub为2,vsub
               是1。
             -line_h:每行文字的高度
             -lh:“ line_h”的别名。
             -main_h:输入高度
             -h:``main_h''的别名。
             -H:``main_h''的别名。
             -main_w:输入宽度
             -w:``main_w''的别名。
             -W:``main_w''的别名。
             -ascent:从基线到用于放置字形的最高/最高网格坐标的最大距离
               轮廓点,用于所有渲染的字形。由于网格与Y的方向,它是一个正值
               轴向上。
             -max_glyph_a:``ascent''的别名。
             -descent:从基线到用于放置字形轮廓的最低网格坐标的最大距离
               点,适用于所有渲染的字形。由于网格的方向,对于Y轴,这是一个负值
               向上。
             -max_glyph_d:``血统''的别名。
             -max_glyph_h:最大字形高度,即已渲染的所有字形的最大高度
               文字,相当于上升-下降。
             -max_glyph_w:最大字形宽度,即已渲染的所有字形的最大宽度
               文本。
             -n:输入帧数,从0开始
             -rand(min,max):返回介于min和max之间的随机数
             -sar:输入样本的宽高比。
             -t:以秒为单位的时间戳,如果输入的时间戳未知,则为NAN
             -text_h:渲染文本的高度
             -th:“ text_h”的别名。
             -text_w:渲染文本的宽度
             -tw:别名“ text_w”。
             -x:绘制文本的x偏移坐标。
             -y:绘制文本的y偏移坐标。
            这些参数允许x和y表达式相互引用,因此您可以例如指定
            y = x / dar
    
        官方文档: `drawtext <https://ffmpeg.org/ffmpeg-filters.html#drawtext>`__
        """
        if text is not None:
            if escape_text:
                text = escape_chars(text, '\\\'%')
            kwargs['text'] = text
        if x != 0:
            kwargs['x'] = x
        if y != 0:
            kwargs['y'] = y
        return filter(stream, drawtext.__name__, **kwargs)
    
    
    @filter_operator()
    def concat(*streams, **kwargs):
        """连接音频和视频流,将它们一个一个地连接在一起。
    
        该过滤器适用于同步视频和音频流的片段。所有片段必须具有相同数量的视频和音频流,输出流也一样。
    
        Args:
            unsafe: 激活不安全模式:如果段的格式不同,则不会失败
    
        由于各种原因(包括编解码器帧大小或
        草率的创作,因此,相关流(例如视频及其音轨)并不总是有完全相同的持续时间,所以相关流(例如视 
        频及其音轨)应该立即连接起来。concat过滤器将使用每个片段中最长流的持续时间(
        最后一个除外),并在必要时使用静音填充较短的音频流。
        为了使此过滤器正常工作,所有段都必须从时间戳0开始。
        所有相应的流在所有段中必须具有相同的参数;过滤系统将自动
        选择视频流的通用像素格式,以及视频的通用采样格式、采样率和频道布局
        音频流,但其他设置(例如分辨率)必须由用户显式转换。
        不同的帧速率是可以接受的,但是会导致输出的帧速率可变。确保配置
        输出文件来处理它。
    
    
        官方文档: `concat <https://ffmpeg.org/ffmpeg-filters.html#concat>`__
        """
        video_stream_count = kwargs.get('v', 1)
        audio_stream_count = kwargs.get('a', 0)
        stream_count = video_stream_count + audio_stream_count
        if len(streams) % stream_count != 0:
            raise ValueError(
                'Expected concat input streams to have length multiple of {} (v={}, a={}); got {}'.format(
                    stream_count, video_stream_count, audio_stream_count, len(streams)
                )
            )
        kwargs['n'] = int(len(streams) / stream_count)
        return FilterNode(streams, concat.__name__, kwargs=kwargs, max_inputs=None).stream()
    
    
    @filter_operator()
    def zoompan(stream, **kwargs):
        """应用缩放和平移效果。
    
        Args:
            zoom:设置缩放表达式。默认值为1。
            x:设置x表达式。默认值为0。
            y:设置y表达式。默认值为0。
            d:以帧数设置持续时间表达式。设置效果持续多少帧
                用于单个输入图像。
            s:设置输出图像尺寸,默认为“ hd720”。
            fps:设置输出帧频,默认为25。
            z:``缩放``的别名。
    
        官方文档: `zoompan <https://ffmpeg.org/ffmpeg-filters.html#zoompan>`__
        """
        return FilterNode(stream, zoompan.__name__, kwargs=kwargs).stream()
    
    
    @filter_operator()
    def hue(stream, **kwargs):
        """修改输入的色调和/或饱和度。
    
        Args:
            h:将色相角指定为度数。它接受一个表达式,默认为“ 0”。
            s:在[-10,10]范围内指定饱和度。它接受一个表达式,默认为“ 1”。
            H:将色相角指定为弧度数。它接受一个表达式,默认为“ 0”。
            b:在[-10,10]范围内指定亮度。它接受一个表达式,默认为“ 0”。
    
        官方文档: `hue <https://ffmpeg.org/ffmpeg-filters.html#hue>`__
        """
        return FilterNode(stream, hue.__name__, kwargs=kwargs).stream()
    
    
    @filter_operator()
    def colorchannelmixer(stream, *args, **kwargs):
        """通过重新混合颜色通道来调整视频输入帧。
    
        Official documentation: `colorchannelmixer <https://ffmpeg.org/ffmpeg-filters.html#colorchannelmixer>`__
        """
        return FilterNode(stream, colorchannelmixer.__name__, kwargs=kwargs).stream()
    
    
    __all__ = [
        'colorchannelmixer',
        'concat',
        'crop',
        'drawbox',
        'drawtext',
        'filter',
        'filter_',
        'filter_multi_output',
        'hflip',
        'hue',
        'overlay',
        'setpts',
        'trim',
        'vflip',
        'zoompan',
    ]

     

    展开全文
  • 在本文中,我们将展示如何调整任何视频文件的大小。 这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案。 更改视频文件的分辨率将是我们在处理视频...

    在本文中,我们将展示如何调整任何视频文件的大小。

    这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案。

    更改视频文件的分辨率将是我们在处理视频文件时将执行的最常见操作之一,因此ffm​​peg能够完美地完成此操作。我们应该想要更改视频文件的分辨率有几个原因,例如:

    • 减少视频的大小。这可以通过降低视频的分辨率来实现。如果我们采用高清(1920x1080像素)的视频,但我们知道我们永远不会在支持比1024x768更高分辨率的屏幕上看到,我们可以降低视频分辨率以适应这种新分辨率,从而节省大量存储空间空间,如果在互联网上使用,也可以节省带宽。
    • 很多时候,视频文件的分辨率会发生变化,从而使其格式标准化。也就是说,如果我们有几个视频并且我们希望它们都在同一分辨率下,则必须经历这个改变分辨率的过程。

    在现代网站的开发中,根据它们出现的位置来分辨各种分辨率的视频是非常有用的。我们可以开发具有响应式设计的网站,其中最适合用户的视频播放。例如,如果我们有各种格式的视频 - 我们说1920x1080,1280x720和640x360-我们可以设计一个响应式网站,让访问者根据访问者浏览器节省带宽重现正确的视频分辨率(请记住,移动用户通常支付传输数据,因此最好尽可能少地传输流量)

    在这个例子中,我们将高清格式(1920x1080像素)的视频分辨率降低到640x360(对于宽高比16:9,这是一个相当常用的配置):

    1

    ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4 -hide_banner

    仅需要使用-vf scale = 640:360以新的所需分辨率(640:360)指示缩放视频滤波器  。要考虑:

    • 我们可以指出我们想要的任何分辨率,但生成的视频将始终具有相同的宽高比。也就是说,它不会扭曲图像,如果视频的宽高比为16:9,它将保持视频的16:9宽高比。该程序将调整生成的视频,使其符合我们给出的分辨率。
    • 更改分辨率时,视频必须再次进行编码过程,因此根据输出格式和用于输出的编解码器,过程可能会很慢。
    • 我们还没有提到它,但大多数时候  将视频转换为更高的分辨率  是没有意义的,因为视频质量没有任何改善。

    更改视频宽高比

    如果我们想要改变视频的外观,知道图像会显得扭曲,我们可以使用额外的过滤器“ setdar”。想象一下,在前一种情况下,我们想要将16:9的宽高比改为4:3,因此视频的分辨率为4:3宽高比,在这种情况下,它将是640x480。进行此转换的ffmpeg命令将是:

    1

    ffmpeg -i video_1920.mp4 -vf scale=640:480,setdar=4:3 video_640x480.mp4 -hide_banner

    我们在这种情况下获得的视频输出  video_640x480.mp4  改变了原始视频的外观并且稍微扭曲了图像,但它将以新的外观获得我们想要的分辨率。

    另一方面,如果我们不想依赖于使用可能“更正常”  (4:3,16:9)的宽高比  ,或者如果我们想要对具有未定义宽高比的其他分辨率进行更改,我们是我们不会害怕可能出现的图像变形,我们可以使用“ setsar”  过滤器,这样可以避免必须保持这些宽高比。通过这种方式,我们可以使用以下命令将之前的视频转换为200x400的分辨率:

    1

    ffmpeg -i video_1920.mp4 -vf scale=200:400,setsar=1:1 video_200x400.mp4 -hide_banner

    从1920x1080分辨率的200x400分辨率的结果使视频输出具有扭曲的外观。

    视频大小调整的示例

    我们将看到一些使用ffmpeg调整视频大小的示例。我们有一个原始视频,分辨率为320x180像素。这里是。

    正如我们之前看到的,我们可以将视频大小调整为原始大小的一半。我们使用以下命令将其从320x180像素分辨率调整为160x90像素分辨率:

    1

    ffmpeg -i video_320x180.mp4 -vf scale=160:90 video_180x90.mp4 -hide_banner

    该视频的大小从1.18MB变为354KB视频(四分之一)。结果如下:

    请注意,视频较小,但我们可以告诉浏览器将其放大,与原始视频相比会有一些质量损失。

    现在让我们将原始视频宽高比从16:9更改为4:3。为此,我们使用以下命令将视频从320x180调整为320x240:

    1

    ffmpeg -i video_320x180.mp4 -vf scale=320:240,setdar=4:3 video_320x240.mp4 -hide_banner

    这是结果(你可以看到图像看起来扭曲):

    现在终于我们将调整视频大小,就好像它必须适合垂直屏幕一样,因此我们将尺寸从320x180像素调整为180x320像素。这是执行任务的命令:

    1

    ffmpeg -i video_320x180.mp4 -vf scale=180:320,setsar=1:1 video_180x320.mp4 -hide_banner

    这是扭曲的结果:

    请注意,在此视频中,我还包含了webm格式的源代码,以实现最大兼容性。我这样做了所以如果您的浏览器无法直接使用mp4文件,您可以在类似的webm文件中看到结果。

    转自:https://www.cnblogs.com/lcxiao/p/11509132.html

    展开全文
  • python ffmpeg推流报错

    万次阅读 2020-03-21 23:42:05
    在pycharm里使用代码进行推流报错 报错如下: ‘ffmpeg’ �����ڲ����ⲿ���Ҳ���ǿ����еij������������ļ���Traceback (most recent call last): File “D:/GITHUB/EVM_LIGHT/...

    在pycharm里使用代码进行推流报错
    报错如下:

    ‘ffmpeg’ �����ڲ����ⲿ���Ҳ���ǿ����еij������������ļ���Traceback (most recent call last): File “D:/GITHUB/EVM_LIGHT/video.py”, line 130, in p.stdin.write(frame.tostring())OSError: [Errno 22] Invalid argument[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceRe

    原因:ffmepg版本太低了,我原来装的是1.4的,要装4的,pycharm里最高版本只能装1.4,建议在anaconda里装

    展开全文
  • FFMpeg视频处理 这里我们将对传上去的视频文件进行处理,所用语言为Python,依赖包为python-opencv,工具为ffmpeg 主要函数为: // 对视频的每一帧进行处理:图像转HSV或黑白 cv2.COLOR_RGB2HSV cv2.COLOR_BGR2GRAY...
  • python使得ffmpeg更加强大

    千次阅读 2018-06-27 09:28:27
    录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了。在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足。 下面按照软件的各部分分别作总结记录: ...
  • 前言 我最近要训练视频插帧模型,需要240fps的原视频,网上唯一找到的这样的数据集只有Adobe240fps(DeepVideoDeblurring/DeepVideoDeblurring_Dataset_Original_High_FPS_Videos),这里面也就几十个视频,加起来也...
  • [python] ffmpeg-python读取rtsp(tcp方式) 问题描述 在多路无线摄像头同时接入时,网络不稳定,经常出现雪花屏的问题。参考网上资料,怀疑是网络摄像头默认使用RTSP协议,RTSP下层默认使用UDP传输,而UDP传输是不...
  • Python:ffmpeg修改视频分辨率

    千次阅读 2020-08-19 16:37:25
    前言 在训练和测试视频的时候,以及使用opencv打开视频的时候,经常会发现速度特别的慢,这是为什么?很大原因是视频本身的分辨率太高。 所以使用ffmpeg统一修改视频的分辨率大小,能够给我们的某些任务提高效率。...
  • 首先需要安装FFmpeg处理媒体文件、ffmpy调用FFmpeg sudo apt install ffmpeg pip install ffmpy FFmpeg的ffprobe命令用于解析媒体文件信息,比如: ffprobe -show_streams -select_streams v -i /home/root/example....
  • FFmpeg音视频同步示例

    2018-03-06 15:27:00
    前面整个的一段时间,我们有了一个几乎无用的电影播放器。当然,它能播放视频,也能播放音频,但是它还不能被称为一部电影。那么我们还要做什么呢? PTS和DTS ...幸运的是,音频和视频流都有一些关于以多快速度和...
  • 视频编码器常用的码率控制方式包括abr(平均码率),crf(限制码率),cqp(固定质量),ffmpeg中AVCodecContext显示提供了码率大小的控制参数,但是并没有提供其他的控制方式。ffmpeg中码率控制方式分为以下几种情况...
  • 【python】windows10下ffmpeg获得rtsp码流图片1.背景2.代码3.运行 1.背景 windows10下安装ffmpeg,通过ffmpeg解码rtsp,然后通过管道传递给python端; 配置:i5-7500 3.40GHZ 4核 ffmpeg:ffmpeg-20200413-59e3a9a-win...
  • 想用python做一个视频播放器,不知道python怎么调用ffmpeg。视频非线性编辑方面打算用moviepy实现
  • 目录一、了解 FFmpeg二、FFmpeg 的组成三、FFmpeg for Windows3.1 下载3.2 安装3.3 测试四、用法五、附录 一、了解 FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。...
  • Python使用ffmpeg下载m3u8高清视频

    千次阅读 2020-05-11 18:45:36
    一、安装ffmpeg环境 1、下载ffmpeg ffmpeg下载链接 2、解压加入环境变量 选择你电脑的版本下载解压把bin目录加入环境变量中 3、Python安装ffmpeg ...二、使用Python加ffmpeg下载视频 from ffmpy3 import FFmpeg ...
  • 视频、图片的各种处理。  "code" class="python">最近在做视频、图片的 色情、版权、暴*恐的深度学习识别,用到了ffmpeg部分功能,功能如下:  ...  每5分钟扫描最近的视频,生成图片,发送完毕
  • 多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。 这里主要介绍一下FFmpeg的一些常用参数,并且主要功能:截取视频、视频格式转换、视频分辨率转换、视频合并...
  • python 使用 ffmpeg 合并音频+视频

    千次阅读 2020-11-04 16:24:01
    import subprocess def video_add_mp4(file_name,mp4_file): outfile_name = file_name.split('.')[0] + '-new.mp4' cmd = f'F:\\FFmpeg\\bin\\ffmpeg -i {mp4_file} -i {file_name} -acodec copy -vcodec copy {...
  • FFmpeg-python使用的一二之一

    万次阅读 2019-08-19 19:59:34
    前言 描述使用原因、需求、吐槽、文章系列介绍  最近要给项目做视频合成的功能,核心的需求是:拍摄视频–>人物抠像、得到背景透明的序列帧–>序列帧进行裁剪、缩放、位移等操作后,与背景、前景视频进行合成...
  • Python在windows下使用ffmpeg进行视频截取帧照片 ffmpeg的一些命令行是在终端使用的并且大多数是以sh文件作为脚本文件运行,在windows下运行linux脚本较为麻烦,所以我写了一个可以遍历文件夹的py脚本文件在windows...
  • Python+FFmpeg音视频格式转换

    千次阅读 2019-12-23 20:44:22
    写在前面 其实这个不全是python的实现的,主要实现由一款名为 FFmpeg 的软件工具实现,单用FFmpeg这款工具软件是可以实现视频格式的,但是这个工具只能在命令行下使用,所以使用起来会给人以 挺麻烦 的感觉。...
  • 直接上代码。。 #!/usr/bin/env python # -*- coding: utf-8 -*- # @version : Python 3.6.6 # @Time : 2019/6/13 11:20 import subprocess ... # file_time = ffmpeg.probe(file_name)...
  • ffmpeg修改视频文件的分辨率

    千次阅读 2019-10-09 05:57:51
    在本文中,我们将展示如何调整任何视频文件的大小。 ...这种方法是在Linux系统(几乎任何发行版)中调整视频文件大小的最佳方法之一,也是Windows和Mac用户的绝佳替代方案。...更改视频文件的分辨率将是我们在处理...
  • FFMpeg无损合并视频的多种方法 python

    千次阅读 2018-08-09 00:44:22
    方法二确实可行 方法1 我试着不行 需要的话自己试试把  python 的调用cmd命令是这么写的 res=os.system("ifconfig"); 众所周知,从某些视频网站下载的视频是分段的。比如新浪视频每隔6分钟分段,...
  • 前提:安装好python ,配置好opencv-python,不然import cv2会报错。代码:#!usr/bin/pythonimport cv2 #使用opencv按一定间隔截取视频帧,并保存为图片 vc = cv2.VideoCapture('D:\\SomkeDetection\\otherSamples\\...
  • python-视频分帧&多帧合成视频

    千次阅读 2018-03-16 17:05:13
    1.视频分帧: import cv2 vidcap = cv2.VideoCapture('005.avi') success,image = vidcap.read() count = 0 success = True while success: success,image = vidcap.read() cv2.imwrite("frame%d.jpg" % count, ...
  • ffmpeg快速命令使用

    2014-04-11 13:20:31
    ffmpeg使用语法 ffmpeg [[options][`-i' input_file]]... {[options] output_file}... 如果没有输入文件,那么视音频捕捉(只在Linux下有效,因为Linux下把音视频设备当作文件句柄来处理)就会起作用。...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

pythonffmpeg

python 订阅