• 使用ffmpeg提取视频中的音频并保存为单声道wav


    1 原始视频信息

    通过ffmpeg -i命令查看视频基本信息

    1. $ ffmpeg -i C0439.MP4
    2. ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
    3. built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
    4. configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
    5. libavutil 58. 29.100 / 58. 29.100
    6. libavcodec 60. 31.102 / 60. 31.102
    7. libavformat 60. 16.100 / 60. 16.100
    8. libavdevice 60. 3.100 / 60. 3.100
    9. libavfilter 9. 12.100 / 9. 12.100
    10. libswscale 7. 5.100 / 7. 5.100
    11. libswresample 4. 12.100 / 4. 12.100
    12. libpostproc 57. 3.100 / 57. 3.100
    13. [mov,mp4,m4a,3gp,3g2,mj2 @ 000001bf832a1c00] st: 0 edit list: 1 Missing key frame while searching for timestamp: 1001
    14. [mov,mp4,m4a,3gp,3g2,mj2 @ 000001bf832a1c00] st: 0 edit list 1 Cannot find an index entry before timestamp: 1001.
    15. [aist#0:1/pcm_s16be @ 000001bf832a9840] Guessed Channel Layout: stereo
    16. Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C0439.MP4':
    17. Metadata:
    18. major_brand : XAVC
    19. minor_version : 16785407
    20. compatible_brands: XAVCmp42iso2
    21. creation_time : 2020-02-06T10:25:07.000000Z
    22. Duration: 00:05:20.32, start: 0.000000, bitrate: 207003 kb/s
    23. Stream #0:0[0x1](und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 200008 kb/s, 59.94 fps, 59.94 tbr, 60k tbn (default)
    24. Metadata:
    25. creation_time : 2020-02-06T10:25:07.000000Z
    26. handler_name : Video Media Handler
    27. vendor_id : [0][0][0][0]
    28. encoder : AVC Coding
    29. Side data:
    30. displaymatrix: rotation of -90.00 degrees
    31. Stream #0:1[0x2](und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
    32. Metadata:
    33. creation_time : 2020-02-06T10:25:07.000000Z
    34. handler_name : Sound Media Handler
    35. vendor_id : [0][0][0][0]
    36. Stream #0:2[0x3](und): Data: none (rtmd / 0x646D7472), 5401 kb/s (default)
    37. Metadata:
    38. creation_time : 2020-02-06T10:25:07.000000Z
    39. handler_name : Timed Metadata Media Handler
    40. timecode : 17:43:44:32
    41. At least one output file must be specified

    2 使用ffmpeg提取视频中的音频并保存为单声道wav

    ffmpeg -i C0439.MP4 -vn -acodec pcm_s16le -ar 44100 -ac 1 audio01.wav
    • “-vn”:禁用视频流,只提取音频。

    • “-acodec pcm_s16le”:指定音频编解码器为 PCM 16 位有符号整数。

    • “-ar 44100”:指定音频采样率为 44100 Hz。

    • “-ac 1”:指定音频通道数为1。

    3 转换结果展示

    1. $ ffmpeg -i audio01.wav
    2. ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
    3. built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
    4. configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
    5. libavutil 58. 29.100 / 58. 29.100
    6. libavcodec 60. 31.102 / 60. 31.102
    7. libavformat 60. 16.100 / 60. 16.100
    8. libavdevice 60. 3.100 / 60. 3.100
    9. libavfilter 9. 12.100 / 9. 12.100
    10. libswscale 7. 5.100 / 7. 5.100
    11. libswresample 4. 12.100 / 4. 12.100
    12. libpostproc 57. 3.100 / 57. 3.100
    13. [aist#0:0/pcm_s16le @ 000001cb17a41e00] Guessed Channel Layout: mono
    14. Input #0, wav, from 'audio01.wav':
    15. Metadata:
    16. encoder : Lavf60.16.100
    17. Duration: 00:05:20.32, bitrate: 705 kb/s
    18. Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels, s16, 705 kb/s
    19. At least one output file must be specified

     4 FFmpeg介绍

    FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。Ffmpeg(FastForward Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合、过滤及播放。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。同时也是一款跨平台的软件,完美兼容Linux、Windows、Mac OSX等平台。其实它由3大部件组成,号称音视频处理工具三剑客:

    • Ffmpeg:由命令行组成,用于多媒体格式转换
    • Ffplay:基于ffmpeg开源代码库libraries做的多媒体播放器
    • Ffprobe:基于ffmpeg做的多媒体流分析器

    Ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:

    •  AVFormat–FFmpeg的封装模块

    AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

    • AVCodec–FFmpeg的编解码模块

    AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。

    • AVFilter–FFmpeg的滤镜模块

    AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。

    • swresample–FFmpeg的音频转换计算模块

    swresample模块提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。

    • swscale–FFmpeg的视频图像转换计算模块

    swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。

    5 FFmpeg常用参数

    5.1 能力集列表

    • -formats:列出支持的文件格式。
    • -codecs:列出支持的编解码器。
    • -decoders:列出支持的解码器。
    • -encoders:列出支持的编码器。
    • -protocols:列出支持的协议。
    • -bsfs:列出支持的比特流过滤器。
    • -filters:列出支持的滤镜。
    • -pix_fmts:列出支持的图像采样格式。
    • -sample_fmts:列出支持的声音采样格式。

    5.2 常用输入选项

    • -i filename:指定输入文件名。
    • -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
    • -ss hh:mm:ss[.xxx]:设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。

    对于输入,以下选项通常是自动识别的,但也可以强制设定。

    • -c codec:指定解码器,需使用能力集列表中的名称。
    • -acodec codec:指定声音的解码器,需使用能力集列表中的名称。
    • -vcodec codec:指定视频的解码器,需使用能力集列表中的名称。
    • -b:v bitrate:设定视频流的比特率,整数,单位bps。
    • -r fps:设定视频流的帧率,整数,单位fps。
    • -s WxH : 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。
    • -pix_fmt format:设定视频流的图像格式(如RGB还是YUV)。
    • -ar sample rate:设定音频流的采样率,整数,单位Hz。
    • -ab bitrate:设定音频流的比特率,整数,单位bps。
    • -ac channels:设置音频流的声道数目。

    5.3 常用输出选项

    • -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
    • -c codec:指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
    • -acodec codec:指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
    • -vcodec codec:指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。
    • -r fps:设定视频编码器的帧率,整数,单位fps。
    • -pix_fmt format:设置视频编码器使用的图像格式(如RGB还是YUV)。
    • -ar sample rate:设定音频编码器的采样率,整数,单位Hz。
    • -b bitrate:设定音视频编码器输出的比特率,整数,单位bps。
    • -ab bitrate:设定音频编码器输出的比特率,整数,单位bps。
    • -ac channels:设置音频编码器的声道数目。
    • -an 忽略任何音频流。
    • -vn 忽略任何视频流。
    • -t hh:mm:ss[.xxx]:设定输出文件的时间长度。
    • -to hh:mm:ss[.xxx]:如果没有设定输出文件的时间长度的画可以设定终止时间点。

    5.4 ffmpeg流标识

    FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:

    • 流序号。譬如“:1”表示第二个流。
    • 流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“:a:1”表示第二个音频流。
    • 节目。节目和流序号可以合并使用。
    • 流标识。流标识是一个内部标识号。

    假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy

    5.5 ffmpeg音频选项

    • -aframes:等价于frames:a,输出选项,用于指定输出的音频帧数目。
    • -aq:等价于q:a,老版本为qscale:a,用于设定音频质量。
    • -atag:等价于tag:a,用于设定音频流的标签。
    • -af:等价于filter:a,用于设定一个声音的后处理过滤链,其参数为一个描述声音后处理链的字符串。

    5.6 ffmpeg视频选项

    • -vframes:等价于frames:v,输出选项,用于指定输出的视频帧数目。
    • -aspect:设置宽高比,如4:3、16:9、1.3333、1.7777等。
    • -bits_per_raw_sample:设置每个像素点的比特数。
    • -vstats:产生video统计信息。
    • -vf:等价于filter:v,用于设定一个图像的后处理过滤链,其参数为一个描述图像后处理链的字符串。
    • -vtag:等价于tag:v,用于设定视频流的标签。
    • -force_fps:强制设定视频帧率。
    • -force_key_frames:显式控制关键帧的插入,参数为字符串,可以是一个时间戳,也可以是一个 “expr:”前缀的表达式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”

    5.7 ffmpeg滤镜选项

    -filter_simple 添加简单滤镜

    -filter_complex FILTER 添加复杂滤镜

    5.8 ffmpeg高级选项

    • -re:要求按照既定速率处理输入数据,这个速率即是输入文件的帧率。
    • -map:指定输出文件的流映射关系。例如 “-map 1:0 -map 1:1”要求将第二个输入文件的第一个流和第二个流写入到输出文件。如果没有-map选项,ffmpeg采用缺省的映射关系。

    5.9 ffprobe参数

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

    • -f format 强制使用某种格式
    • -sexagesimal 时间单元格式化 HOURS:MM:SS.MICROSECONDS
    • -pretty 格式美化
    • -print_format format 格式化(可选值: default, compact, csv, flat, ini, json, xml)
    • -of format -print_format别名
    • -select_streams stream_specifier 选择指定流
    • -sections 打印节的结构和信息
    • -show_data 显示包数据
    • -show_data_hash 显示包数据哈希值
    • -show_error 显示文件探测/检测错误
    • -show_format 显示格式或者容器信息
    • -show_frames 显示帧信息
    • -show_format_entry entry 根据格式/容器信息显示指定entry
    • -show_packets 显示包信息
    • -show_programs 显示程序信息
    • -show_streams 显示流信息
    • -show_chapters 显示章节信息
    • -count_frames 统计每个流的帧数
    • -count_packets 统计每个流的包数
    • -show_program_version 显示ffprobe版本
    • -show_library_versions show library versions
    • -show_versions show program and library versions
    • -show_pixel_formats 显示像素格式
    • -show_private_data show private data
    • -private same as show_private_data
    • -bitexact force bitexact output
    • -read_intervals read_intervals set read intervals
    • -default generic catch all option

    5.10 ffplayer参数

    • -x 强制设置视频显示窗口的宽度
    • -y 强制设置视频显示窗口的高度
    • -S 设置视频显示的宽高
    • -fs 强制全屏显示
    • -an 屏蔽音频
    • -vn 屏蔽视频
    • -Sn 屏蔽字幕
    • -ss 根据设置的秒进行定位拖动
    • -t 设置播放视频/音频长度
    • -Bytes 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动
    • -Nodisp 关闭图形化显示窗口
    • -f 强制使用设置的格式进行解析
    • -window_title 设置显示窗口的标题
    • -af 设置音频的滤镜
    • -Codec 强制使用设置的codec进行解码
    • -autorotate 自动旋转视频
    • -ast 设置将要播放的音频流
    • -vst 设置将要播放的视频流
    • -sst 设置将要播放的字幕流
    • -Stats 输出多媒体播放状态
    • -Fast 非标准化规范的多媒体兼容优化
    • -sync 音视频同步设置可设置根据音频视频进行参考,视频时间参考,或者外部扩展时间进行参考
    • -autoexit 多媒体播放完毕自动退出ffplay,ffplay默认播放完毕不退出播放器
    • -exitonkeydown 当有按键按下事件产生时退出ffplay
    • -exitonmousedown 当有鼠标按键事件产生时退出ffplay
    • -loop 设置多媒体文件循环播放次数
    • -framedrop 当CPU资 源占用过高时,自动丢帧
    • -infbuf 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景
    • -vf 视频滤镜设置
    • -acodec 强制使用设置的音频解码器
    • -vcodec 强制使用设置的视频解码器
    • -scodec 强制使用设置的字幕解码器
  • 相关阅读:
    编程中的插槽(slot)含义介绍
    java编程基础总结——30.synchronized和Lock锁解决线程安全问题
    手把手分析 lv_config.h 文件
    【AIGC】大语言模型
    想要精通算法和SQL的成长之路 - 验证二叉树的前序序列化
    【Golang】使用代码绘制图表的开源库对比
    数据湖(十四):Spark与Iceberg整合查询操作
    解决“ImportError: DLL load failed while importing _rust: 找不到指定的程序的问题
    VBA_MF系列技术资料1-202
    03.2 线性回归的从零开始实现
  • 原文地址:https://blog.csdn.net/lsb2002/article/details/136568262