当前位置: 首页 > article >正文

ffmpeg 音视频转化

ffmpeg 音视频转化

FFmpeg是一个开源的跨平台多媒体处理工具,它提供了一套强大的命令行工具和库,用于对音频、视频和图像进行转码、编辑、剪辑、合并、分离、解码、编码等操作。下面详细介绍一些关键特点和功能:
格式支持:FFmpeg支持几乎所有常见的音频、视频和图像格式,包括但不限于MP3、AAC、WAV、FLAC、MP4、AVI、MKV、MOV、WMV、JPEG、PNG等。无论是输入还是输出,FFmpeg都能够处理多种格式。
编解码器支持:FFmpeg支持众多音频和视频编解码器,例如H.264、H.265、VP9、AAC、MP3、Opus等。这意味着你可以使用FFmpeg进行不同编码格式之间的转换和压缩,同时保持较高的音质。
视频处理功能:FFmpeg可以进行视频剪辑、裁剪、合并、旋转、调整大小、添加水印等操作。你可以根据需要对视频进行各种处理和修改,满足个性化需求。
音频处理功能:FFmpeg可以进行音频剪辑、混音、音量调整、变速、去噪等操作。你可以对音频文件进行编辑和增强,实现自定义效果。
流媒体处理:FFmpeg支持流媒体协议,如RTMP、HLS、RTSP等,可以进行直播推流、录制、转码等操作。这使得它在实时视频流处理和媒体服务器开发中得到广泛应用。
视频过滤器:FFmpeg提供了丰富的视频过滤器,可以应用各种效果和调整,如滤镜、色彩调整、降噪、去抖动、字幕添加等。这些过滤器可以轻松地改变视频的外观和质量。
音频过滤器:FFmpeg也提供了多种音频过滤器,可以实现混音、均衡器、重采样、立体声效果等功能。你可以根据需要对音频进行各种处理和增强。
跨平台支持:FFmpeg可以运行在多个操作系统上,包括Windows、macOS、Linux等,具有良好的跨平台兼容性。你可以在不同的环境中使用相同的命令和工具来处理多媒体文件。

FFmpeg是一个功能强大且灵活的多媒体处理工具,适用于多种场景,包括但不限于音视频转码、编辑、剪辑、流媒体处理等。它在开源社区中得到广泛应用,并持续发展和改进,丰富的文档和资源供用户参考和学习。本篇简单讲音视频之间转换。

作者:炭烤毛蛋 ,点击博主了解更多。


提示: 各种操作系统可以下载编译的ffmpeg,配置环境变量后直接运行。

文章目录

  • ffmpeg 音视频转化
  • 前期准备
  • 1. 音频转换
    • 1.1 amr转为mp3:
    • 1.2 amr转为wav
    • 1.3 mp3转为wav
    • 1.4 wav转为amr
    • 1.5 wav转为mp3
    • 1.6 wav转pcm
  • 1.7 pcm转wav:
  • 2. 视频转换
    • 2.1 wmv转为mp4
    • 2.2 抓取H264视频流
    • 2.3 H264视频流转为mp4
    • 2.4 接收rtsp并存为视频文件
  • 2.5 mp4转为 AMR
  • 结语


前期准备

系统环境:Ubuntu 20.04
前期准备:

  1. 下载ffmpeg源代码:默认下载最新版本ffmpeg v6.1.tar.xz。
  2. 预装编译依赖环境。
  • 安装编译依赖项:
sudo apt-get update
sudo apt-get install build-essential git
  • 克隆 FFmpeg 代码仓库:
git clone https://github.com/FFmpeg/FFmpeg.git
  • 安装额外的编译依赖项:
sudo apt-get install yasm nasm libx264-dev libfdk-aac-dev libmp3lame-dev libopus-dev libvpx-dev
  • 配置编译选项:
cd FFmpeg
./configure --enable-gpl --enable-libx264 --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libvpx

也可使用比较全的配置

./configure --prefix=/usr/share/ffmpeg --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-lzma --enable-zlib --enable-gmp --enable-libvorbis --enable-libvo-amrwbenc --enable-libspeex --enable-libxvid --enable-libaom --enable-avisynth --enable-libopenmpt --enable-libfdk-aac --enable-nonfree

–prefix=/usr/share/ffmpeg 指定 ffmpeg 编译后库文件路径
–enable-libxxx 指定 ffmpeg 同时安装的工具库

  • 编译和安装:
make -j$(nproc)
sudo make install

等待编译安装完成,就可以愉快使用 ffmpeg。

  • 配置环境变量
    修改当前用户配置文件 ~/.bashrc
~/.bashrc
+export PATH=$PATH:/usr/bin/ffmpeg

验证环境变量是否正常

# 查看版本
ffmepg --version

提示:执行 ffmpeg 报错

ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory

系统无法找到ffmpeg的动态链接库。可以使用profile方式
/etc/profile

fi
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/share/ffmpeg/lib

1. 音频转换

1.1 amr转为mp3:

input.amr 文件转换为 output.mp3 文件。-acodec 参数用于指定音频编解码器(这里我们使用 libmp3lame 编码器),而 -qscale:a 参数用于设置音频音质等级。2 是一个取值范围为0-9的数,表示音频音质等级,数字越小表示音质越高。常用的取值有4-6,2代表较高音质。

ffmpeg -i input.amr -acodec libmp3lame -qscale:a 2 output.mp3

如果你想调整输出的比特率和采样率,可以添加 -b:a 和 -ar 参数。例如,下面的命令将输入文件转换为128kbps比特率、44.1kHz采样率的MP3文件。

ffmpeg -i input.amr -acodec libmp3lame -qscale:a 2 -b:a 128k -ar 44100 output.mp3

当然也可以使用默认参数简化参数

ffmpeg -i test.amr amr2mp3 out.mp3

1.2 amr转为wav

将把 input.amr 文件转换为 output.wav 文件。FFmpeg会自动识别输入和输出文件的格式,因此你只需要指定输入和输出文件的路径即可。

ffmpeg -i input.amr output.wav

如果需要指定音频参数,例如采样率和比特深度。例如,下面的命令将AMR文件转换为16kHz采样率、16位深度的WAV文件:

bash
ffmpeg -i input.amr -ar 16000 -acodec pcm_s16le output.wav

- -ar 16000  指定了采样率为16kHz
- -acodec pcm_s16le 指定了音频编解码器为16位线性脉冲编码调制(PCM)格式。

同样也可以简化参数:
```bash
ffmpeg -acodec libamr_nb -i test.amr output.wav

1.3 mp3转为wav

mp3 转为 wav 简化版:

ffmpeg -i DING.mp3 -f wav test.wav

如果你需要指定音频参数,如采样率、比特深度等。例如:将MP3文件转换为16kHz采样率、16位深度的WAV音乐。

ffmpeg -i input.mp3 -ar 16000 -acodec pcm_s16le output.wav
  • -ar 16000 指定了采样率为16kHz。
  • -acodec pcm_s16le 指定了音频编解码器为16位线性脉冲编码调制(PCM)格式。
    注意:该方式只是进行格式转换,而不会改变音频文件的音质。由于MP3是有损压缩格式,转换为WAV并不能恢复原始音质。

1.4 wav转为amr

FFmpeg将WAV格式音频文件转换为AMR格式:

ffmpeg -i test.wav -acodec libopencore_amrnb -ab 12.2k -ar 8000 -ac 1 output.amr
  • -acodec libopencore_amrnb:指定音频编解码器为 libopencore_amrnb,这是FFmpeg中用于处理AMR-NB格式音频的编解码器。
  • -ar 8000:指定采样率为8000Hz,AMR-NB格式音频通常使用这个采样率。
  • -ab 12.2k:指定比特率为12.2kbps,AMR-NB格式音频的标准比特率。
  • -ac 1:指定通道数为1,AMR-NB格式音频通常是单声道。

不知道arm波特率时,可以忽略该参数。

ffmpeg -i PA003.wav -ar 8000 -ab 12.2k -ac 1 output.amr

提示:AMR格式是有损压缩的音频格式,转换为AMR格式会导致一定的音质损失。

1.5 wav转为mp3

默认默认mp3 压缩格式:

ffmpeg -i test.wav -f mp3 -acodec libmp3lame -y output.mp3

调整音质等级方式转换:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3
  • -codec:a libmp3lame:指定音频编解码器为libmp3lame,这是FFmpeg中用于处理MP3格式音频的编解码器。
  • -qscale:a 2:指定音频质量等级为2,取值范围为0到9,数值越小质量越好,0为最高质量。在通常情况下,2或者4都是较好的选择。
    提示:MP3格式是有损压缩的音频格式,转换为MP3格式会导致一定的质量损失

1.6 wav转pcm

WAV文件本身就是一种容器格式,它可以包含PCM编码的音频数据。WAV文件内部通常就是PCM编码的音频数据(也就是所谓的RAW音频数据)。
提取WAV文件中的原始PCM音频数据

ffmpeg -i input.wav -f s16be -ar 8000 -acodec pcm_s16be output.raw
  • -f s16le 指定了输出文件的格式为16位的小端字节序(pcm_s16le)
    • -ar 8000:指定采样率为8000Hz。
ffmpeg -i input.wav -f s16le -acodec pcm_s16le output.pcm

1.7 pcm转wav:

FFmpeg会读取 input.pcm 文件中的PCM音频数据,并根据指定的参数将其转换为WAV格式的音频数据。

ffmpeg -f s16be -ar 44100 -ac 2 -acodec s16le -i input.raw output.wav
  • -f s16le:指定输入文件的格式为16位的小端字节序(pcm_s16le),这是常见的PCM编码格式之一。
  • -ar 44100:指定采样率为44100Hz,这是常见的音频采样率。
  • -ac 2:指定通道数为2,表示双声道立体声。
    WAV格式是一种容器格式,它可以包含不同编码方式的音频数据;在转换时需要明确指定采样率和通道数等参数,以确保输出的WAV文件符合预期的音频格式要求。

2. 视频转换

2.1 wmv转为mp4

FFmpeg会读取 input.wmv 文件中的视频和音频数据,并根据指定的编码器将其转换为MP4格式的视频。

# old
ffmpeg -i input.wmv -vcodec libx264 -acodec aac out.mp4
# new
ffmpeg -i input.wmv -c:v libx264 -c:a aac output.mp4
  • -c:v libx264:指定视频编码器为libx264,这是一个开源的H.264编码器,常用于高质量视频压缩。
  • -c:a aac:指定音频编码器为AAC,这是一种常用的音频编码格式。

WMV和MP4都是常见的视频容器格式,转换时只改变了容器格式,并不会对视频和音频进行重新编码。

2.2 抓取H264视频流

ffmpeg -i "输入URL" -vcodec copy -vbsf h264_mp4toannexb -an out.h264
  • -c:v copy 表示直接复制视频流而不进行重新编码,保持原始的H.264编码格式。
  • -f h264 指定输出文件的格式为H.264。
  • vbsf为过滤方法,即将flv规定的H264组织方式转换回H264协议书规定的字节流格式
  • -an 禁掉源文件中的音频,因为出来的码流不需要音频
  • vcodec copy 必须参数

注意,抓取视频流需要正确的URL和网络连接。确保提供的URL是有效的,并且你的机器能够访问该URL上的视频流。

2.3 H264视频流转为mp4

将 input.h264 文件(H.264视频流)转换为 output.mp4 文件(MP4文件)。

ffmpeg -i sample.h264 -c:v copy -f mp4 haha.mp4
  • -c:v copy:表示直接复制视频流而不进行重新编码,保持原始的H.264编码格式。
  • -f mp4:指定输出文件的格式为MP4。

转换过程中仅仅是将视频流从H.264格式封装到MP4格式,而不会对视频进行重新编码。

2.4 接收rtsp并存为视频文件

# old
ffmpeg -rtsp_transport tcp -i rtsp://输入RTSP地址 -vcodec copy -acodec copy -t 30 -f mp4 rtsp-out.mp4
# new
ffmpeg -i rtsp://输入RTSP地址 -c:v copy -c:a copy rtsp-out.mp4

ex: ffmpeg -rtsp_transport tcp -i rtsp://streaming1.osu.edu/media2/ufsap/ufsap.mov -vcodec copy -acodec copy -t 30 -f mp4 rtsp-out.mp4

  • -rtsp_transport tcp:指明传输方式是tcp方式(也可以是udp)
  • -t 30:指明我录制30秒
  • -c:v copy 表示直接复制视频流而不进行重新编码,保持原始编码格式。
  • -c:a copy 表示直接复制音频流。

2.5 mp4转为 AMR

FFmpeg会读取 input.mp4 文件中的音频数据,并根据指定的编码器将其转换为AMR格式的音频。

ffmpeg -i test.mp4 -c:a copy test.amr
ffmpeg -i input.mp4 -c:a amr_nb -ar 8000 -ac 1 output.amr

-c:a amr_nb:指定音频编码器为AMR-NB,这是一种常用的音频编码格式。
-ar 8000:指定采样率为8000Hz,这是AMR格式的标准采样率。
-ac 1:指定声道数为1,这是AMR格式的标准声道数。

重采样转为 12.20kHz。

# new
ffmpeg -i test.mp4 -c:a libopencore_amrnb -ac 1 -ar 8000 -b:a 12.20k -y test.amr
# old
ffmpeg -i test.mp4 -acodec libopencore_amrnb -ac 1 -ar 8000 -ab 12.20k -y test.amr
  • -ab 12.2k:指定比特率为12.2kbps,AMR-NB格式音频的标准比特率。

结语

不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋 。


http://www.kler.cn/news/149060.html

相关文章:

  • Maven——Maven发展历程
  • Java程序连接 nacos集群
  • Taro3+Vue3重构Mpvue小程序项目踩坑记
  • 一台服务器能放多少个网站?
  • 西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告
  • (2)(2.1) Lightware SF40/C(360度)
  • 一文搞定XMLHttpRequest,AJAX,Promise,Axios及操作实战
  • 解密Long型数据传递:Spring Boot后台如何避免精度丢失问题
  • 探索亚马逊云科技云存储服务的性能
  • 封装Vue中的axios请求库
  • 【Spark基础】-- RDD 转 Dataframe 的三种方式
  • 231128 刷题日报
  • 【精选】Spring整合MyBatis,Junit 及Spring 事务Spring AOP面向切面详解
  • Qt问题 QString 和 void* 相互转化
  • Kafka 保证消息消费全局顺序性
  • Flask教程入门
  • Android 13.0 修改系统默认设备类型的平板电脑类型为设备类型
  • MySQL索引优化实战一
  • 万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC
  • SpringBoot项目整合Redis,Rabbitmq发送、消费、存储邮件
  • 代码随想录算法训练营 ---第四十九天
  • 在Visual Studio Code中安装加速TypeScript程序开发的插件
  • Git工作流和Commit规范
  • 12:kotlin类和对象 -- 继承
  • C语言第三十六弹--实现转移表的多种方法
  • redis基本数据结构
  • FFA 2023|字节跳动 7 项议题入选
  • 计算机基础知识57
  • Ubuntu 上使能 SELinux
  • 王者小游戏