ffmpeg系列学习——FFmpeg的音视频处理

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

1.音视频的采样率、采样位深度和声道数

音频和视频的采样率、采样位深度和声道数是媒体文件中的重要参数,它们会直接影响到音视频的质量和文件大小。下面对它们进行详细解释:

采样率

采样率指音频每秒钟采样的次数,用赫兹(Hz)表示。采样率越高,音频的还原度越高,音质也越好,但同时文件大小也会增加。常见的采样率有44.1kHz、48kHz、96kHz等。

采样位深度

采样位深度指音频采样时每个样本的位数,通常是8位、16位、24位、32位等。采样位深度越高,音频的动态范围越大,能表现更细腻的音频信息,但同时文件大小也会增加。

声道数

声道数指音频的通道数量,常见的有单声道(mono)和立体声(stereo)两种。立体声一般包括左右两个声道,而单声道只有一个声道。通常来说,立体声能够更好地还原音频的空间感,但同时文件大小也会增加。

在处理音视频时,了解这些参数可以帮助我们更好地选择合适的参数进行处理,从而得到更高质量的音视频文件。

2.音频处理的常用命令

音频处理是 FFmpeg 的主要功能之一。以下是一些常用的音频处理命令:

  • 转换音频格式

将一个音频文件转换成另一个格式,可以使用下面的命令:

ffmpeg -i input.mp3 output.wav

上面的命令将 input.mp3 文件转换成 output.wav 文件。

  • 剪切音频

可以使用下面的命令剪切音频:

ffmpeg -ss 00:00:10 -i input.mp3 -t 10 output.mp3

上面的命令将 input.mp3 文件从第 10 秒开始剪切,长度为 10 秒,并将结果保存到 output.mp3 文件。

  • 合并音频

可以使用下面的命令合并多个音频文件:

ffmpeg -i "concat:input1.mp3|input2.mp3" -acodec copy output.mp3

上面的命令将 input1.mp3 和 input2.mp3 文件合并成一个 output.mp3 文件。

  • 调整音量

可以使用下面的命令调整音频的音量:

ffmpeg -i input.mp3 -filter:a "volume=2.0" output.mp3
  • 提取音频

可以使用下面的命令从视频中提取音频:

ffmpeg -i input.mp4 -vn -acodec copy output.mp3

上面的命令从 input.mp4 文件中提取音频,忽略视频,直接将音频保存到 output.mp3 文件。

3.视频处理的常用命令

视频处理是 FFmpeg 最常用的功能之一,以下是一些常用的视频处理命令:

  1. 视频转码命令
ffmpeg -i input.mp4 -vcodec copy -acodec copy output.avi

该命令将 input.mp4 转换为 output.avi,同时保留原有的视频和音频编码格式。

2.裁剪视频命令

ffmpeg -i input.mp4 -ss 00:00:05 -t 00:00:10 -c:v libx264 -c:a copy output.mp4

该命令将 input.mp4 的第 5 秒开始裁剪,裁剪 10 秒钟,视频编码为 H.264,音频保持原格式,输出为 output.mp4

3.视频合并命令

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

该命令将 input1.mp4、input2.mp4 和 input3.mp4 三个视频文件合并为一个文件 output.mp4,视频和音频编码格式保持不变。

4.添加水印命令

ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4

该命令将输入视频 input.mp4 和水印文件 watermark.png 进行叠加,叠加位置为视频左上角偏移 10 像素的位置,输出为 output.mp4。

5.提取视频帧命令

ffmpeg -i input.mp4 -vf "select=eq(n\,0)" -q:v 3 -f image2 output.jpg

该命令将输入视频 input.mp4 的第一帧提取出来,输出为 output.jpg,图像质量为 3。

4.音视频混合和分离

1、音视频混合

音视频混合是指将多个音频或视频文件混合成一个文件,或将音频和视频文件合并成一个视频文件。

合并视频文件

将多个视频文件合并成一个视频文件,可以使用 FFmpeg 中的 concat 协议。下面是一个例子,将三个视频文件 test1.mp4、test2.mp4 和 test3.mp4 合并成一个文件 output.mp4:

ffmpeg -i "concat:test1.mp4|test2.mp4|test3.mp4" -c copy output.mp4

其中,-i 参数指定输入文件,使用 concat 协议,参数为需要合并的文件列表,多个文件之间使用 | 分隔;-c copy 参数指定复制视频和音频流,不进行转码。

合并音频文件

将多个音频文件合并成一个音频文件,可以使用 FFmpeg 中的 concat 协议。下面是一个例子,将三个音频文件 test1.mp3、test2.mp3 和 test3.mp3 合并成一个文件 output.mp3:

ffmpeg -f concat -i <(for f in test1.mp3 test2.mp3 test3.mp3; do echo "file '$PWD/$f'"; done) -c copy output.mp3

其中,-f concat 指定使用 concat 协议,-i 参数指定输入文件,使用子进程的方式生成文件列表,-c copy 参数指定复制音频流,不进行转码。

合并音视频文件

将音频和视频文件合并成一个视频文件,可以使用 FFmpeg 中的 -map 选项。下面是一个例子,将 test.mp4 视频和 test.mp3 音频合并成一个视频文件 output.mp4:

ffmpeg -i test.mp4 -i test.mp3 -map 0:v:0 -map 1:a:0 -c:v copy -c:a copy output.mp4

其中,-i 参数指定输入文件,-map 选项指定需要使用的视频流和音频流,-c:v copy 和 -c:a copy 参数分别指定复制视频流和音频流,不进行转码。

2、音视频分离

音视频分离是指将一个音视频文件分离成音频文件和视频文件,可以分别对其进行处理或编辑。

分离视频文件

将视频文件分离成视频流和音频流,可以使用 FFmpeg 中的 -map 选项。下面是一个例子,将 test.mp4 分离成视频文件 test_video.mp4 和音频文件 test_audio.mp3:

ffmpeg -i test.mp4 -map 0:v:0 -c copy test_video.mp4 -map 0:a:0 -c copy test_audio.mp3

其中,-i 参数指定输入文件,-map 选项指定需要使用的视频流和音频流,-c copy 参数指定复制流,不进行转码。

分离音频文件

分离音频文件是指将音频流从视频文件中分离出来,生成一个单独的音频文件,可以方便地对音频进行编辑和处理。

ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 4 output.mp3

其中,

-i input.mp4:指定输入文件名,这里是一个视频文件

-vn:表示不处理视频流,只处理音频流。

-acodec copy:表示复制音频流,不进行重新编码。

-acodec libmp3lame:表示将音频流重新编码为MP3格式。

-q:a 4:表示指定输出音频的质量,值为0-9,数值越小,质量越好,文件大小越大。

output.aac:指定输出文件名,这里是一个AAC格式的音频文件。

5.音视频同步处理

音视频同步处理是指将音频和视频的时间轴进行同步,使其在播放过程中达到良好的效果。在实际应用中,由于采集设备、编码器、网络传输等因素的影响,音频和视频的时间轴往往会存在一定的偏差。因此,需要对音视频进行同步处理,以保证播放效果的质量。

在 FFmpeg 中,可以通过设置音频和视频的时间基(time base)和时间戳(timestamp)来实现音视频同步处理。

时间基是一种时间单位,用于将时间戳转换为实际的时间。在 FFmpeg 中,音频和视频的时间基可以通过音频流和视频流的 time_base 属性获取。时间戳则是指某个样本在整个媒体流中的时间位置,一般表示为 PTS(Presentation Time Stamp)或 DTS(Decode Time Stamp)。在 FFmpeg 中,可以通过 AVPacket 结构体中的 pts 和 dts 字段获取时间戳。

具体的音视频同步处理操作,可以参考以下步骤:

代码层面

获取音频流和视频流的 time_base 属性,将其作为时间基。

AVRational audio_timebase = input_audio_stream->time_base;
AVRational video_timebase = input_video_stream->time_base;

获取音频流和视频流的时钟基准值(时钟基准值指的是第一个样本的时间戳),分别保存为 audio_clock 和 video_clock 变量。

double audio_clock = 0;
double video_clock = 0;
AVPacket packet;
int ret;
 
// 读取音频流和视频流的样本
while ((ret = av_read_frame(input_format_context, &packet)) == 0) {
    if (packet.stream_index == audio_stream_index) {
        // 处理音频样本
        // ...
        audio_clock = av_q2d(audio_timebase) * frame->pts;
    } else if (packet.stream_index == video_stream_index) {
        // 处理视频样本
        // ...
        video_clock = av_q2d(video_timebase) * frame->pts;
    }
 
    av_packet_unref(&packet);
}

计算音频和视频的时间差(diff),并根据时间差来调整音频和视频的时间戳。

double diff = video_clock - audio_clock;
 
if (diff > 0.1) {
    // 视频比音频快,需要将音频的时间戳加上时间差
    // ...
} else if (diff < -0.1) {
    // 音频比视频快,需要将视频的时间戳加上时间差
    // ...
}

将调整后的音频样本和视频样本写入输出文件。

AVFrame *audio_frame;
AVFrame *video_frame;
 
// 循环处理音频样本和视频样本,并写入输出文件
while (has_more_audio_samples || has_more_video_samples) {
    if (has_more_audio_samples) {
        // 处理音频样本
        // ...
        av_interleaved_write_frame(output_format_context, &

命令行

  1. 根据时间戳对齐音视频

在进行音视频合并时,需要对齐音频和视频的时间戳,保证它们在相同的时间播放。可以通过使用FFmpeg的"-itsoffset"参数来实现对齐。该参数用于指定一个时间偏移量,可以正数或负数。正数表示音频比视频快,负数表示视频比音频快。例如:

ffmpeg -i video.mp4 -itsoffset 0.5 -i audio.mp3 -c:v copy -c:a copy output.mp4

上述命令中,将音频向后偏移0.5秒,使其与视频对齐。

  1. 调整音频速率

有时候,在进行音视频处理时,可能需要改变音频的播放速率。可以使用FFmpeg的"atempo"过滤器来实现调整音频速率。该过滤器接受一个浮点数参数,表示音频的播放速率。例如:

ffmpeg -i input.mp3 -filter:a "atempo=1.5" output.mp3

上述命令将音频播放速率提高到1.5倍。

  1. 调整音频音量

在进行音视频处理时,有时候需要调整音频的音量大小。可以使用FFmpeg的"volume"过滤器来实现调整音量大小。该过滤器接受一个浮点数参数,表示音频的音量大小。例如:

ffmpeg -i input.mp3 -filter:a "volume=2.0" output.mp3

上述命令将音频的音量调整为原来的2倍。

  1. 调整视频速率

类似于调整音频速率,有时候在进行音视频处理时,需要调整视频的播放速率。可以使用FFmpeg的"setpts"过滤器来实现调整视频速率。该过滤器接受一个时间参数,表示视频播放的速率。例如:

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

上述命令将视频的播放速率降低到原来的一半。

  1. 调整视频画面大小

在进行音视频处理时,有时候需要调整视频的画面大小。可以使用FFmpeg的"scale"过滤器来实现调整视频画面大小。该过滤器接受一个字符串参数,表示视频的宽度和高度。例如:

ffmpeg -i input.mp4 -vf scale=640:360 output.mp4

上述命令将视频的画面大小调整为640x360。

原文 ffmpeg系列学习--FFmpeg的音视频处理_ffmpeg itsoffset_ayou_llf的博客-CSDN博客

 文章来源地址https://www.toymoban.com/news/detail-755933.html

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

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

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

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

相关文章

  • 【FFmpeg】ffmpeg 命令行参数 ⑧ ( 使用 ffmpeg 转换封装格式 | 音视频编解码器参数设置 | 视频 帧率 / 码率 / 分辨率 设置 | 音频 码率 / 采样率 设置 )

    音视频 文件 从 采样 - 处理 - 得到原始数据帧队列 - 音视频编码 - 音视频包队列 - 格式封装 的过程如下 : 封装格式 参考 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装

    2024年04月17日
    浏览(85)
  • 音视频开发-ffmpeg介绍-系列一

    目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念: 三.ffmpeg、ffplay、ffprobe区别      4.1 ffmpeg是用于转码的应用程序  4.2 fffplay是用于播放的应用程序       4.3 ffprobe是用于查看文件格式的应用程序      4.4 ffmpeg是用于转码的应用程

    2024年02月16日
    浏览(46)
  • 音视频剪辑|FFMPEG|windows10下的音视频格式转换,遮挡填充,GIF动图制作,背景音频抽取,替换

    最近对于音视频和图像的处理问题比较感兴趣,但发现很多目前需要的功能要么需要付费但不会过于麻烦,要么比较麻烦,很可能某个功能实现需要安装很多软件 例如,视频转GIF动图,该功能的实现要么使用Photoshop全家桶,要么找在线网站,或者是wps充会员,或者找其它方法

    2024年02月20日
    浏览(59)
  • [音视频处理] 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日
    浏览(61)
  • 音视频处理 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)
  • 音视频处理工具FFmpeg与Java结合的简单使用

    一、什么是FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcod

    2024年02月11日
    浏览(66)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包