Python的音视频文件处理

这篇具有很好参考价值的文章主要介绍了Python的音视频文件处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ffmpeg-python

ffmpeg-pythonffmpeg 的一个包装,通过 python 调用ffmpegAPI,实现高效的音视频文件处理
python处理视频,Python,python,音视频,ffmpeg

开始之前

安装 ffmpeg

# Linux
sudo apt install ffmpeg

# macOS
brew install ffmpeg

安装 ffmpeg-python

# 方式一
pip install ffmpeg-python

# 方式二
git clone git@github.com:kkroening/ffmpeg-python.git
pip install -e ./ffmpeg-python

参考

  • ffmpeg官方网站
  • ffmpeg-python的代码库与技术文档

技术背景

音视频文件处理流程

输入文件 ⟹ 解封装 已编码的数据包 ⟹ 解码 被编码的帧 ( 可进行信号处理操作 ) ⟹ 编码 已编码的数据包 ⟹ 封装 输出文件 输入文件 \stackrel{解封装}{\Longrightarrow} 已编码的数据包 \stackrel{解码}{\Longrightarrow} 被编码的帧(可进行信号处理操作) \stackrel{编码}{\Longrightarrow} 已编码的数据包 \stackrel{封装}{\Longrightarrow} 输出文件 输入文件解封装已编码的数据包解码被编码的帧(可进行信号处理操作)编码已编码的数据包封装输出文件

python处理视频,Python,python,音视频,ffmpeg

ffmpeg-python 中通过 ffmpeg.input 对音视频文件解封装,通过 ffmpeg.filter 对被解码的帧进行信号处理操作,通过 ffmpeg.output 将数据包封装成音视频文件,整个过程会构建成一个结点图,最后通过调用 ffmpeg.run 执行节点图上的操作

import ffmpeg

"""
输入函数
ffmpeg.input(filename, **kwargs)

其中,参数
filename - 输入文件url
kwargs - 关键字参数逐字传递给ffmpeg

目的,创建读取文件结点

另外,如果存在音频那么注册为audio属性方法,可通过.video或["v"]获取,如果存在视频那么注册为video属性方法,可通过.audio或["a"]获取
"""
kwargs = {"t":20, "f":"mp4", "acodec":"pcm"}
ffmpeg.input('in.mkv', **kwargs)
input('in.mkv', **kwargs)
stream_video = ffmpeg.input('in.mkv', **kwargs).video
stream_video = ffmpeg.input('in.mkv', **kwargs)["v"]
stream_audio = ffmpeg.input('in.mkv', **kwargs).audio
stream_audio = ffmpeg.input('in.mkv', **kwargs)["a"]


"""
过滤器函数 
ffmpeg.filter(stream_spec, filter_name, *args, **kwargs)

其中,参数
stream_spec – 一个Stream, Streams列表,或者字典映射给Stream的标签
filter_name – ffmpeg中filter的名字, 例如colorchannelmixer、crop、hflip、volume、concat等过滤器
*args – 要逐字传递给ffmpeg的参数列表
**kwargs – 要逐字传递给ffmpeg的关键字参数列表

目的,创建处理数据结点

另外,作为函数时最好用filter_避免与python的filter内建函数混淆,其中filter_会直接return在ffmpeg中的filter,带有多个输出时使用ffmpeg.filter_multi_output(stream_spec, filter_name, *args, **kwargs)
"""
ffmpeg.input('in.mp4').filter('hflip')
ffmpeg.filter(input('in.mp4'), "hflip") 


"""
输出函数 
ffmpeg.output(*streams_and_filename, **kwargs)

其中,参数
video_bitrate – 即ffmpeg中的视频码率参数 -b:v, e.g. video_bitrate=1000.
audio_bitrate – 即ffmpeg中的音频码率参数 -b:a, e.g. audio_bitrate=200.
format – 即ffmpeg中的格式参数 -f, e.g. format='mp4' (equivalent to f='mp4').

目的,创建写入文件结点
"""
kwargs = {"-b:v":1000, "-b:a":200, "f":"mp4", "acodec":"pcm", "vcodec":"rawvideo"}
streams = ffmpeg.input("in.mkv").filter('hflip')
ffmpeg.output(streams, "out.mp4", **kwargs)
streams.output(streams, "out.mp4", **kwargs)


"""
运行函数
ffmpeg.run(stream_spec, cmd='ffmpeg', capture_stdout=False, capture_stderr=False, input=None, quiet=False, overwrite_output=False)

其中,参数
capture_stdout – 是否捕捉标stdout
capture_stderr – 是否捕捉到stderr
quiet – 设置capture_stdout和capture_stderr的简写
input – 要发送到stdin的文本
overwrite_output - 是否覆盖已有文件
其中,函数返回包含捕获的stdout和stderr数据

目的,调用ffmpeg执行构建好的结点图

另外,ffmpeg.run_async(stream_spec, cmd='ffmpeg', pipe_stdin=False, pipe_stdout=False, pipe_stderr=False, quiet=False, overwrite_output=False),异步调用ffmpeg执行构建好的节点图
"""
streams = ffmpeg.input('in.mp4').filter('hflip').output('out.mp4').run(overwrite_output=True)
ffmpeg.run(streams, overwrite_output=True)

另外,音视频文件解封装后得到的数据包称为 stream(如视频、音频与字幕等)可以通过 ffmpeg.probe 查看,结点图可通过 ffmpeg.view 查看

  • 执行函数

    """
    音视频文件摘要函数 ffmpeg.probe(filename, cmd='ffprobe', **kwargs)
    
    如果ffprobe返回非零退出码,则返回一个带有通用错误消息的Error,可以通过访问异常的stderr属性来检索stderr输出
    """
    
    ffmpeg.probe("in.mkv")
    
  • 打印输出

    {'streams': [{'index': 0,
       'codec_name': 'hevc',
       'codec_long_name': 'H.265 / HEVC (High Efficiency Video Coding)',
       'profile': 'Main 10',
       'codec_type': 'video',
       'codec_time_base': '1001/24000',
       'codec_tag_string': '[0][0][0][0]',
       'codec_tag': '0x0000',
       'width': 1920,
       'height': 1080,
       'coded_width': 1920,
       'coded_height': 1080,
       'has_b_frames': 2,
       'sample_aspect_ratio': '1:1',
       'display_aspect_ratio': '16:9',
       'pix_fmt': 'yuv420p10le',
       'level': 120,
       'color_range': 'tv',
       'color_space': 'bt2020nc',
       'color_transfer': 'smpte2084',
       'color_primaries': 'bt2020',
       'refs': 1,
       'r_frame_rate': '24000/1001',
       'avg_frame_rate': '24000/1001',
       'time_base': '1/1000',
       'start_pts': 0,
       'start_time': '0.000000',
       'disposition': {'default': 1,
        'dub': 0,
        'original': 0,
        'comment': 0,
        'lyrics': 0,
        'karaoke': 0,
        'forced': 0,
        'hearing_impaired': 0,
        'visual_impaired': 0,
        'clean_effects': 0,
        'attached_pic': 0,
        'timed_thumbnails': 0},
       'tags': {'language': 'jpn',
        'BPS': '3285534',
        'DURATION': '00:24:10.032000000',
        'NUMBER_OF_FRAMES': '34766',
        'NUMBER_OF_BYTES': '595516342',
        '_STATISTICS_WRITING_APP': "mkvmerge v70.0.0 ('Caught A Lite Sneeze') 64-bit",
        '_STATISTICS_TAGS': 'BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES'}},
      {'index': 1,
       'codec_name': 'eac3',
       'codec_long_name': 'ATSC A/52B (AC-3, E-AC-3)',
       'codec_type': 'audio',
       'codec_time_base': '1/48000',
       ...
       }
      },
      {'index': 2,
       'codec_name': 'eac3',
       'codec_long_name': 'ATSC A/52B (AC-3, E-AC-3)',
       'codec_type': 'audio',
       'codec_time_base': '1/48000',
       ...
       }
      },
      {'index': 3,
       'codec_name': 'subrip',
       'codec_long_name': 'SubRip subtitle',
       'codec_type': 'subtitle',
       'codec_time_base': '0/1',
       ...
       }
      },
     },
      ......
    }
    
  • 执行函数

    """
    结点图可视化函数 view(detail=False, filename=None, pipe=False, **kwargs)
    
    其中,参数
    detail - 是否打印结点和边的关键信息,如stream的映射关系等
    """
    streams = ffmpeg.input('in.mp4')
    video = streams.video.filter('hflip')
    audio = streams.audio
    ffmpeg.concat(video, audio, v=1, a=1).overlay(ffmpeg.input("overlay.png")).output("out.mp4").view(detail=True)
    
  • 打印输出

    python处理视频,Python,python,音视频,ffmpeg

快速开始

简单的例子,水平翻转视频

python处理视频,Python,python,音视频,ffmpeg

import ffmpeg

# 方式一、一般写法
stream = ffmpeg.input('input.mp4')
stream = ffmpeg.hflip(stream)
stream = ffmpeg.output(stream, 'output.mp4')
ffmpeg.run(stream)

# 方式二、数据流写法(更易读)
(
    ffmpeg
    .input('input.mp4')
    .hflip()
    .output('output.mp4')
    .run()
)
复杂的例子,执行多滤波器

ffmpeg 非常强大,但使用多个过滤器(filter)处理的信号时,命令代码显得非常粗糙。例如,将输入视频两次修剪后合并,再将水平翻转的图片覆盖在视频上,接着在上面画一个框输出视频

python处理视频,Python,python,音视频,ffmpeg

图中绿色代表输入文件,黄色代表过滤器,蓝色代表输出文件,箭头代表数据流

python处理视频,Python,python,音视频,ffmpeg

ffmpeg 的命令很难记忆与理解琐碎

ffmpeg -i input.mp4 -i overlay.png -filter_complex "[0]trim=start_frame=10:end_frame=20[v0];\
    [0]trim=start_frame=30:end_frame=40[v1];[v0][v1]concat=n=2[v2];[1]hflip[v3];\
    [v2][v3]overlay=eof_action=repeat[v4];[v4]drawbox=50:50:120:120:red:t=5[v5]"\
    -map [v5] output.mp4

ffmpeg-python 的命令简单明了

import ffmpeg

in_file = ffmpeg.input('input.mp4')
overlay_file = ffmpeg.input('overlay.png')
(
    ffmpeg
    .concat(
        in_file.trim(start_frame=10, end_frame=20),
        in_file.trim(start_frame=30, end_frame=40),
    )
    .overlay(overlay_file.hflip())
    .drawbox(50, 50, 120, 120, color='red', thickness=5)
    .output('out.mp4')
    .run()
)

更多尝试

生成视频缩略图

python处理视频,Python,python,音视频,ffmpeg

(
    ffmpeg
    .input(in_filename, ss=time)
    .filter('scale', width, -1)
    .output(out_filename, vframes=1)
    .run()
)
将视频转换为numpy数组

python处理视频,Python,python,音视频,ffmpeg

out, _ = (
    ffmpeg
    .input('in.mp4')
    .output('pipe:', format='rawvideo', pix_fmt='rgb24')
    .run(capture_stdout=True)
)
video = (
    np
    .frombuffer(out, np.uint8)
    .reshape([-1, height, width, 3])
)
通过管道读取单个视频帧为jpeg

python处理视频,Python,python,音视频,ffmpeg

out, _ = (
    ffmpeg
    .input(in_filename)
    .filter('select', 'gte(n,{})'.format(frame_num))
    .output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
    .run(capture_stdout=True)
)
将声音转换为原始PCM音频

python处理视频,Python,python,音视频,ffmpeg

out, _ = (ffmpeg
    .input(in_filename, **input_kwargs)
    .output('-', format='s16le', acodec='pcm_s16le', ac=1, ar='16k')
    .overwrite_output()
    .run(capture_stdout=True)
)
从帧序列组装视频

python处理视频,Python,python,音视频,ffmpeg

(
    ffmpeg
    .input('/path/to/jpegs/*.jpg', pattern_type='glob', framerate=25)
    .output('movie.mp4'
    .run()
)

添加额外过滤器

python处理视频,Python,python,音视频,ffmpeg

(
    ffmpeg
    .input('/path/to/jpegs/*.jpg', pattern_type='glob', framerate=25)
    .filter('deflicker', mode='pm', size=10)
    .filter('scale', size='hd1080', force_original_aspect_ratio='increase')
    .output('movie.mp4', crf=20, preset='slower', movflags='faststart', pix_fmt='yuv420p')
    .view(filename='filter_graph')
    .run()
)
音视频管线

python处理视频,Python,python,音视频,ffmpeg

in1 = ffmpeg.input('in1.mp4')
in2 = ffmpeg.input('in2.mp4')
v1 = in1.video.hflip()
a1 = in1.audio
v2 = in2.video.filter('reverse').filter('hue', s=0)
a2 = in2.audio.filter('areverse').filter('aphaser')
joined = ffmpeg.concat(v1, a1, v2, a2, v=1, a=1).node
v3 = joined[0]
a3 = joined[1].filter('volume', 0.8)
out = ffmpeg.output(v3, a3, 'out.mp4')
out.run()
单声道到立体声带偏移和视频

python处理视频,Python,python,音视频,ffmpeg

audio_left = (
    ffmpeg
    .input('audio-left.wav')
    .filter('atrim', start=5)
    .filter('asetpts', 'PTS-STARTPTS')
)

audio_right = (
    ffmpeg
    .input('audio-right.wav')
    .filter('atrim', start=10)
    .filter('asetpts', 'PTS-STARTPTS')
)

input_video = ffmpeg.input('input-video.mp4')

(
    ffmpeg
    .filter((audio_left, audio_right), 'join', inputs=2, channel_layout='stereo')
    .output(input_video.video, 'output-video.mp4', shortest=None, vcodec='copy')
    .overwrite_output()
    .run()
)
Jupyter Frame Viewer

python处理视频,Python,python,音视频,ffmpeg

Tensorflow Streaming

python处理视频,Python,python,音视频,ffmpeg

  • ffmpeg 解码输入视频
  • tensorflow 使用 “deep dream” 处理视频
  • ffmpeg 编码输出视频
process1 = (
    ffmpeg
    .input(in_filename)
    .output('pipe:', format='rawvideo', pix_fmt='rgb24', vframes=8)
    .run_async(pipe_stdout=True)
)

process2 = (
    ffmpeg
    .input('pipe:', format='rawvideo', pix_fmt='rgb24', s='{}x{}'.format(width, height))
    .output(out_filename, pix_fmt='yuv420p')
    .overwrite_output()
    .run_async(pipe_stdin=True)
)

while True:
    in_bytes = process1.stdout.read(width * height * 3)
    if not in_bytes:
        break
    in_frame = (
        np
        .frombuffer(in_bytes, np.uint8)
        .reshape([height, width, 3])
    )

    # See examples/tensorflow_stream.py:
    out_frame = deep_dream.process_frame(in_frame)

    process2.stdin.write(
        out_frame
        .astype(np.uint8)
        .tobytes()
    )

process2.stdin.close()
process1.wait()
process2.wait()

python处理视频,Python,python,音视频,ffmpeg

FaceTime webcam input (OS X)
(
    ffmpeg
    .input('FaceTime', format='avfoundation', pix_fmt='uyvy422', framerate=30)
    .output('out.mp4', pix_fmt='yuv420p', vframes=100)
    .run()
)
Stream from a local video to HTTP server
video_format = "flv"
server_url = "http://127.0.0.1:8080"

process = (
    ffmpeg
    .input("input.mp4")
    .output(
        server_url, 
        codec = "copy", # use same codecs of the original video
        listen=1, # enables HTTP server
        f=video_format)
    .global_args("-re") # argument to act as a live stream
    .run()
)

在终端中使用 ffplay 接收视频

$ ffplay -f flv http://localhost:8080
Stream from RTSP server to TCP socket
packet_size = 4096

process = (
    ffmpeg
    .input('rtsp://%s:8554/default')
    .output('-', format='h264')
    .run_async(pipe_stdout=True)
)

while process.poll() is None:
    packet = process.stdout.read(packet_size)
    try:
        tcp_socket.send(packet)
    except socket.error:
        process.stdout.close()
        process.wait()
        break
自定义过滤器

虽然 ffmpeg-python 只直接提供了部分ffmpeg 的过滤器 API,但仍可以通过 .filter 运算符见解引用全部的过滤器

(
    ffmpeg
    .input('dummy.mp4')
    .filter('fps', fps=25, round='up')
    .output('dummy2.mp4')
    .run()
)
多个输入

接收多个输入流的过滤器可以通过将输入流作为数组传递给 ffmpeg.filter 使用

main = ffmpeg.input('main.mp4')
logo = ffmpeg.input('logo.png')
(
    ffmpeg
    .filter([main, logo], 'overlay', 10, 10)
    .output('out.mp4')
    .run()
)
多个输出

产生多个输出的过滤器可以与 .filter_multi_output 一起使用文章来源地址https://www.toymoban.com/news/detail-776619.html

split = (
    ffmpeg
    .input('in.mp4')
    .filter_multi_output('split')
)
(
    ffmpeg
    .concat(split[0], split[1].reverse())
    .output('out.mp4')
    .run()
)

到了这里,关于Python的音视频文件处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [音视频处理] FFmpeg使用指北1-视频解码

    本文将详细介绍如何使用ffmpeg 4.4在C++中解码多种格式的媒体文件,这些媒体文件可以是视频、视频流、图片,或是桌面截屏或USB摄像头的实时图片。解码文件后,还将每帧图片转换为OpenCV的Mat格式以供后续使用。 目录 1 基于ffmpeg的媒体文件解码 1.1 简介 1.2 详细代码 2 ffmpeg函

    2024年02月07日
    浏览(67)
  • FFmpeg音视频处理工具介绍及应用

    FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。Ffmpeg(FastForward Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合

    2024年02月08日
    浏览(77)
  • JavaCV与FFmpeg:音视频流处理技巧

    1. JavaCV简介 JavaCV是一个开源的Java接口,为OpenCV、FFmpeg和其他类似工具提供了封装。它允许Java开发者直接在他们的应用程序中使用这些强大的本地库,而无需深入了解复杂的本地代码。JavaCV特别适用于处理图像和视频数据,提供了一系列的功能,如图像捕获、处理和视频编解

    2024年02月04日
    浏览(60)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(87)
  • 开源的跨平台的音视频处理工具FFmpeg

    FFmpeg是一个开源的跨平台的音视频处理工具,可以对音频、视频进行转码、裁剪、调节音量、添加水印等操作。 广泛的格式支持。 FFmpeg能够解码、编码、转码、复用、分离、流式传输、过滤和播放几乎人类和机器所创造的任何内容。它支持最古老且晦涩难懂的格式,也支持

    2024年02月15日
    浏览(68)
  • 强大开源的音视频处理工具ffmpeg安装与使用

    FFmpeg 是一个开源的跨平台音视频处理工具,提供了丰富的命令行模式下音视频处理功能,包括格式转换、编解码、过滤器应用等。 由于 FFmpeg 支持的格式广泛,且可用于多个平台和操作系统(如 Windows、Linux、MacOS 等),因此它已成为许多多媒体应用程序和服务的核心组件。

    2024年02月05日
    浏览(73)
  • 如何使用Python进行可视化/音视频处理?

    要使用Python进行可视化和音视频处理,可以使用以下库: matplotlib:用于绘制各种类型的图表和图形,包括折线图、柱状图、散点图等。 seaborn:基于matplotlib的可视化库,提供更高级别的图表和样式,用于创建各种吸引人的统计图表。 plotly:用于创建交互式图表和数据可视化

    2024年02月09日
    浏览(67)
  • python+moviepy音视频处理(一):基本操作

    目录 视频处理 视频加载和输出 视频转换gif 视频裁剪 视频音量调节 去掉视频声音 视频中的音频提取与替换 获取视频属性 倍数播放视频 截取视频某帧为封面 多视频拼接 音频处理 替换视频文件的音频 多个音频文件拼接 安装:pip install moviepy 中文官网:moviepy-cn 文档 \\\'\\\'\\\' movie

    2023年04月23日
    浏览(54)
  • pydub,一个有趣的 Python 音视频处理库!

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。   目录 ​编辑 前言 什么是 pydub? 安装 pydub 基本用法  1. 播放音频文件  2. 剪切音频文件 高级用法  1. 合并音频文件  2. 调整音量 实际

    2024年02月21日
    浏览(74)
  • python moviepy 自动化音视频处理实践

    MoviePy是一个用于视频编辑的Python库。它提供了一种简单且直观的方式来处理视频文件,包括剪辑、合并、裁剪、添加文本、添加音频等操作。使用MoviePy,你可以通过编写Python代码来创建和编辑视频,而无需使用复杂的视频编辑软件。 MoviePy建立在另一个库Pygame和软件MoviePy

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包