Python实现视频中添加音频工具详解


Posted in Python onDecember 06, 2021

前言

本文提供在在无音频的视频中添加音频的python工具,附上代码。

环境依赖

ffmpy安装:

pip install ffmpy -i https://pypi.douban.com/simple

主要代码

不废话,上代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/5 1:49
# @Author  : 剑客阿良_ALiang
# @Site    : 
# @File    : video_add_audio_tool.py
 
import os
import uuid
from ffmpy import FFmpeg
 
 
# 视频添加音频
def video_add_audio(video_path: str, audio_path: str, output_dir: str):
    _ext_video = os.path.basename(video_path).strip().split('.')[-1]
    _ext_audio = os.path.basename(audio_path).strip().split('.')[-1]
    if _ext_audio not in ['mp3', 'wav']:
        raise Exception('audio format not support')
    _codec = 'copy'
    if _ext_audio == 'wav':
        _codec = 'aac'
    result = os.path.join(
        output_dir, '{}.{}'.format(
            uuid.uuid4(), _ext_video))
    ff = FFmpeg(
        inputs={video_path: None, audio_path: None},
        outputs={result: '-map 0:v -map 1:a -c:v copy -c:a {} -shortest'.format(_codec)})
    print(ff.cmd)
    ff.run()
    return result

代码说明

1、video_add_audio方法参数有视频地址、音频地址、输出目录。

2、音频支持mp3以及wav格式,其中wav格式ffmpeg命令会有所差别。

验证一下

if __name__ == '__main__':
    print(video_add_audio('data/999.mp4', 'data/2dc9fa4f-802d-4076-b2c3-b1da886a7cc0.wav', 'data/'))
E:\ProgramData\Anaconda3\envs\pytorch\python.exe C:/Users/yi/PycharmProjects/test/video_add_audio_tool.py
ffmpeg -i data/999.mp4 -i data/2dc9fa4f-802d-4076-b2c3-b1da886a7cc0.wav -map 0:v -map 1:a -c:v copy -c:a aac -shortest data/6854281e-19ac-4edc-9638-4124a2a22e52.mp4
ffmpeg version n4.3.1-20-g8a2acdc6da Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 9.3-win32 (GCC) 20200320
  configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvmaf --disable-vulkan --enable-libvorbis --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-ffnvcodec --enable-cuda-llvm --disable-libglslang --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libtwolame --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-libs=-lgomp
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'data/999.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.76.100
  Duration: 00:00:04.88, start: 0.000000, bitrate: 8420 kb/s
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1280x688 [SAR 1:1 DAR 80:43], 8417 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Guessed Channel Layout for Input Stream #1.0 : stereo
Input #1, wav, from 'data/2dc9fa4f-802d-4076-b2c3-b1da886a7cc0.wav':
  Metadata:
    copyright       : bbs.cnxp.com(C)2009
    title           : ���ɱ�ֲ�̫��(���ݼ�����).Leon.1994.Directors.Cut.720p.Bluray
    encoder         : Lavf58.45.100
  Duration: 00:00:05.02, bitrate: 1411 kb/s
    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
Output #0, mp4, to 'data/6854281e-19ac-4edc-9638-4124a2a22e52.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1280x688 [SAR 1:1 DAR 80:43], q=2-31, 8417 kb/s, 25 fps, 25 tbr, 12800 tbn, 12800 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc58.91.100 aac
frame=  122 fps=0.0 q=-1.0 Lsize=    5096kB time=00:00:04.87 bitrate=8561.0kbits/s speed=72.6x    
video:5015kB audio:77kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.087828%
[aac @ 00000192e5913d40] Qavg: 181.360
data/6854281e-19ac-4edc-9638-4124a2a22e52.mp4
 
Process finished with exit code 0

OK,最终输出合成后的视频地址。 

到此这篇关于Python实现视频中添加音频工具详解的文章就介绍到这了,更多相关Python 视频添加音频内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中readline判断文件读取结束的方法
Nov 08 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
Python OpenCV形态学运算示例详解
Apr 07 Python
Python实现GIF动图以及视频卡通化详解
Python实现照片卡通化
用Python爬取英雄联盟的皮肤详细示例
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 #Python
python 管理系统实现mysql交互的示例代码
Python中super().__init__()测试以及理解
Dec 06 #Python
浅析Python中的随机采样和概率分布
Dec 06 #Python
You might like
php实现图片以base64显示的方法
2016/10/13 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python删除列表中重复记录的方法
2015/04/28 Python
python通过post提交数据的方法
2015/05/06 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
工商管理专业应届生求职信
2013/11/04 职场文书
《落花生》教学反思
2014/02/25 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书