草庐IT

FFmpeg从视频中提取音频

Linrra 2023-06-29 原文

文章目录

FFmpeg从视频中提取音频

参考博客

流文件基本信息

查看

使用FFprobe

ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。—— FFmpeg最全教程

ffprobe -i .\TMElive.mp4

ffprobe -i .\MUTE.mp3

音频采样率、采样深度和比特率

  1. 采样率/采样频率
  • 采样率是指每秒钟记录的音频样本数。 模拟信号采样为数字信号,一个音频样本只是一个数字,代表在一个特定时间点的测量声波值。
  • 音频采样率和视频帧率是相似的,但在每一个中保证可用性的通常的最低数字是非常不同的。对于视频来说,为了保证运动的准确描述,每秒至少需要24帧。对于音频来说,要明确地表示英语语音,每秒的最小采样数是8000赫兹。

8,000 Hz是电话所用采样率, 对于人的说话已经足够
11,025 Hz是AM调幅广播所用采样率
22,050 Hz和24,000 Hz 是FM调频广播所用采样率
32,000 Hz是miniDV 数码视频 camcorder、DAT (LP mode)所用采样率
44,100 Hz是音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率 (超过该采样率,人耳很难分辨)
47,250 Hz是商用 PCM 录音机所用采样率
48,000 Hz是miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
50,000 Hz是商用数字录音机所用采样率
96,000 或者 192,000 Hz 是DVD-Audio、一些 LPCM DVD 音轨、BD-ROM(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率
2.8224 MHz是Direct Stream Digital 的 1 位 sigma-delta modulation 过程所用采样率

  1. 采样深度/采样精度/采样大小

用多大bit(多少位0/1)来表示每个采样点处的振幅。越大把振幅分得越精细,录音听起来越接近原声。电话音频最常见的采样深度是16比特和32比特。—— 《通信原理》信源编码

  1. 比特率
  • 比特率指每秒传输信息的比特数。1B=8b, B=byte(字节), b=bit(位)
  • 音频的比特率公式: 比特率 = 采样率 * 单个的周期音频数据长度 。

如16bit 双声道 48KHz音频的比特率
48KHz * (16 * 2) = 1536kbps = 192 kBps

从视频中提取音频

FFmpeg使用方法 ffmpeg [全局选项] {[输入文件选项] -i ‘输入文件’} … {[输出文件选项] ‘输出文件’} —— FFmpeg最全教程

  • ffmpeg -i .\TMElive.mp4 -ss 01:00:31 -t 00:02:52.0 -vn -b:a 192k -ar 44100 -ac 2 -acodec libmp3lame -y .\Mute_1.mp3

    ffprobe -i .\MUTE_1.mp3

主要选项

-f fmt (input/output)’ 
	强制输入或输出文件格式。通常,输入文件的格式是自动检测的,
	输出文件的格式是通过文件扩展名来进行猜测的,所有该选项大
	多数时候不需要。
‘-i filename (input)’ 
	输入文件名
‘-y (global)’ 
	覆盖输出文件而不询问
‘-n (global)’ 
	不覆盖输出文件,如果一个给定的输出文件已经存在,则立即
	退出
‘-t duration (output)’ 
	当到达 duration 时,停止写输出。
	duration 可以是一个数字(),或者使用hh:mm:ss[.xxx]形式。
	-to 和 -t 是互斥的,-t 优先级更高。
‘-to position (output)’ 
	在 position 处停止写输出。
	duration 可以是一个数字(),或者使用hh:mm:ss[.xxx]形式。
	-to 和 -t 是互斥的,-t 优先级更高。
‘-ss position (input/output)当作为输入选项时(-i 之前),在输入文件中跳转到 position。
	需要注意的是,在大多数格式中,不太可能精确的跳转,因此,
	ffmpeg 将跳转到 position 之前最接近的位置。当进行转码
	并且 ‘-accurate_seek’ 打开时(默认),位于跳转点和 position 
	之间的额外部分将被解码并且丢弃。当做流拷贝或者当使用
	‘-noaccurate_seek’时,它将被保留下来。
	当作为输出选项时(在输出文件名前),解码但是丢弃输入,直到
	时间戳到达 position。
	position 可以是秒或者 hh:mm:ss[.xxx] 形式

音频选项

-ar[:stream_specifier] freq (input/output,per-stream)’
	设置音频采样率。
‘-aq q (output)’
	设置音频质量。这是 -q:a 的别名
‘-ac[:stream_specifier] channels (input/output,per-stream)’
	设置音频通道数。
‘-vn (output)’
	禁止视频录制
‘-an (output)’
	禁止音频录制
‘-acodec codec (input/output)’
	设置音频codec。这是-codec:a的别名
‘-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)’
	设置音频采样格式

高级选项

-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]] | [linklabel] (output)’
	指定一个或多个流作为输出文件的源。
	命令行中的第一个 -map 选项,指定输出流0的源,
	第二个 -map 选项,指定输出流1的源,等等。

添加歌曲信息和封面

软件 mp3tag

歌曲信息

  1. 右键 — 属性 — 详细信息 可以添加、更改歌曲信息

  1. 使用-metadata创建ID3 tags 【参考博客
  • ffmpeg -i .\MUTE.mp3 -metadata data="2022-07-29" .\MUTE_1.mp3
  • 清除音频文件所有tag信息 ffmpeg -i .\MUTE.mp3 -map_metadata -1 .\mute.mp3
    把value置空删除某个标签 ffmpeg -i .\MUTE.mp3 -metadata genre="" .\mute.mp3
  • 创建元数据文本文件 ffmpeg -i .\TMElive\MUTE.mp3 -f ffmetadata mute.txt
  • 把.txt写入元数据中 ffmpeg -i .\TMElive\MUTE.mp3 -i mute.txt -map_metadata 1 -c:a copy -id3v2_version 3 -write_id3v1 1 .\mute.mp3

    -map_metadata 1 代表使用输入顺序为1的文件作为metadata,也就是 metadata.txt。c:a 代表codec audio的意思,这里用的是 copy。id3v2_version 3-write_id3v1 1 是为了对Windows兼容加上的。

;FFMETADATA1
=major_brand
date=2022
title=MUTE
album=TME live 夏日岐遇
album_artist=孟美岐
genre=Pop
artist=孟美岐
encoder=Lavf58.76.100

封面

ffmpeg -i .\TMElive\在他乡.mp3 -i .\TMElive\pic\在他乡.jpg -c copy -map 0:a -map 1:v -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" .\TMElive\在他乡_cover.mp3 —— 参考官网


拓展

  • 提高音量 ffmpeg -i .\TMElive\一生有你_fin.mp3 -filter:a “volume=5dB” 一生有你.mp3 但是不能损失质量
  • 怎么给音频文件添加歌词信息,并时间上同步起来
  • 实现音乐播放软件中的所有完整的歌曲信息

python + ffmpeg

video_path = 'D:/Users/Admin/Desktop/TMElive/MMQ_TMElive.mp4'
audio_path = 'D:/Users/Admin/Desktop/TMElive/audio/'
pic_path = 'D:/Users/Admin/Desktop/TMElive/pic/'
mdata = 'D:/Users/Admin/Desktop/TMElive/mdata.txt'
music = ["醒", "Miss", "If", "Alone", "重塑", "一生有你"]
start_time = ["00:02:03", "00:05:56", "00:10:06", " 00:33:41", "00:51:18", "01:02:51"]
duration = ["00:03:16.0", "00:04:00.0", "00:02:49.0", "00:03:25.0", "00:03:29.0", "00:02:33.0"]
    
for i,m in enumerate(music):
	ss = start_time[i]
	d = duration[i]
	pic = pic_path + m +".jpg"
	song = audio_path + m + "_1.mp3"
	out = audio_path + m + "_fin.mp3"
	# subprocess.run("ffmpeg -i %s -ss %s -t %s -vn -b:a 192k -ar 44100 -ac 2 -acodec libmp3lame -y %s" %(video_path, ss, d, song))
	# subprocess.run("ffmpeg -i %s -map_metadata -1 -c copy -y %s" %(song, out))
	# subprocess.run("ffmpeg -i %s -i %s -map_metadata 1 -c:a copy -id3v2_version 3 -write_id3v1 1 %s" %(song, mdata, out))
	subprocess.run("ffmpeg -i %s -i %s -c copy -map 0:a -map 1:v -metadata:s:v title=\"Album cover\" -metadata:s:v comment=\"Cover (Front)\" %s" %(song, pic, out))

有关FFmpeg从视频中提取音频的更多相关文章

  1. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  2. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  3. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  4. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  5. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  6. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  7. ruby - 如何在ruby中提取方括号内的内容 - 2

    我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和

  8. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  9. 用于从 Open3.popen3 标准输出中提取值的正则表达式 - 2

    如何获取外部命令的输出并从中提取值?我有这样的东西:stdin,stdout,stderr,wait_thr=Open3.popen3("#{path}/foobar",configfile)if/exit0/=~wait_thr.value.to_srunlog.puts("Foobarexitednormally.\n")puts"Testcompleted."someoutputvalue=stdout.read("TX.*\s+(\d+)\s+")puts"Outputvalue:"+someoutputvalueend我没有在标准输出上使用正确的方法,因为Ruby告诉我它不能

  10. ruby - 使用 Ruby CSV 提取一列 - 2

    我一直在尝试从csv文件中获取单个列。我已经阅读了文档,http://www.ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html但仍然不太了解如何使用它。如果我使用CSV.table,与CSV.read相比,响应速度非常慢。我承认我正在加载的数据集非常大,这正是我只想从中获取单个列的原因。我的请求目前看起来像这样@dataTable=CSV.table('path_to_csv.csv')当我调试时,我得到了的响应#ThedocumentationsaysIshouldbeabletouseby_col(),butwhenItrytooutpu

随机推荐