1.音視頻的采樣率、采樣位深度和聲道數(shù)
音頻和視頻的采樣率、采樣位深度和聲道數(shù)是媒體文件中的重要參數(shù),它們會直接影響到音視頻的質(zhì)量和文件大小。下面對它們進行詳細解釋:
采樣率
采樣率指音頻每秒鐘采樣的次數(shù),用赫茲(Hz)表示。采樣率越高,音頻的還原度越高,音質(zhì)也越好,但同時文件大小也會增加。常見的采樣率有44.1kHz、48kHz、96kHz等。
采樣位深度
采樣位深度指音頻采樣時每個樣本的位數(shù),通常是8位、16位、24位、32位等。采樣位深度越高,音頻的動態(tài)范圍越大,能表現(xiàn)更細膩的音頻信息,但同時文件大小也會增加。
聲道數(shù)
聲道數(shù)指音頻的通道數(shù)量,常見的有單聲道(mono)和立體聲(stereo)兩種。立體聲一般包括左右兩個聲道,而單聲道只有一個聲道。通常來說,立體聲能夠更好地還原音頻的空間感,但同時文件大小也會增加。
在處理音視頻時,了解這些參數(shù)可以幫助我們更好地選擇合適的參數(shù)進行處理,從而得到更高質(zhì)量的音視頻文件。
2.音頻處理的常用命令
音頻處理是 FFmpeg 的主要功能之一。以下是一些常用的音頻處理命令:
- 轉(zhuǎn)換音頻格式
將一個音頻文件轉(zhuǎn)換成另一個格式,可以使用下面的命令:
ffmpeg -i input.mp3 output.wav
上面的命令將 input.mp3 文件轉(zhuǎn)換成 output.wav 文件。
- 剪切音頻
可以使用下面的命令剪切音頻:
ffmpeg -ss 00:00:10 -i input.mp3 -t 10 output.mp3
上面的命令將 input.mp3 文件從第 10 秒開始剪切,長度為 10 秒,并將結(jié)果保存到 output.mp3 文件。
- 合并音頻
可以使用下面的命令合并多個音頻文件:
ffmpeg -i "concat:input1.mp3|input2.mp3" -acodec copy output.mp3
上面的命令將 input1.mp3 和 input2.mp3 文件合并成一個 output.mp3 文件。
- 調(diào)整音量
可以使用下面的命令調(diào)整音頻的音量:
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 最常用的功能之一,以下是一些常用的視頻處理命令:
- 視頻轉(zhuǎn)碼命令
ffmpeg -i input.mp4 -vcodec copy -acodec copy output.avi
該命令將 input.mp4 轉(zhuǎn)換為 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,圖像質(zhì)量為 3。
4.音視頻混合和分離
1、音視頻混合
音視頻混合是指將多個音頻或視頻文件混合成一個文件,或?qū)⒁纛l和視頻文件合并成一個視頻文件。
合并視頻文件
將多個視頻文件合并成一個視頻文件,可以使用 FFmpeg 中的 concat 協(xié)議。下面是一個例子,將三個視頻文件 test1.mp4、test2.mp4 和 test3.mp4 合并成一個文件 output.mp4:
ffmpeg -i "concat:test1.mp4|test2.mp4|test3.mp4" -c copy output.mp4
其中,-i 參數(shù)指定輸入文件,使用 concat 協(xié)議,參數(shù)為需要合并的文件列表,多個文件之間使用 | 分隔;-c copy 參數(shù)指定復(fù)制視頻和音頻流,不進行轉(zhuǎn)碼。
合并音頻文件
將多個音頻文件合并成一個音頻文件,可以使用 FFmpeg 中的 concat 協(xié)議。下面是一個例子,將三個音頻文件 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 協(xié)議,-i 參數(shù)指定輸入文件,使用子進程的方式生成文件列表,-c copy 參數(shù)指定復(fù)制音頻流,不進行轉(zhuǎn)碼。
合并音視頻文件
將音頻和視頻文件合并成一個視頻文件,可以使用 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 參數(shù)指定輸入文件,-map 選項指定需要使用的視頻流和音頻流,-c:v copy 和 -c:a copy 參數(shù)分別指定復(fù)制視頻流和音頻流,不進行轉(zhuǎn)碼。
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 參數(shù)指定輸入文件,-map 選項指定需要使用的視頻流和音頻流,-c copy 參數(shù)指定復(fù)制流,不進行轉(zhuǎn)碼。
分離音頻文件
分離音頻文件是指將音頻流從視頻文件中分離出來,生成一個單獨的音頻文件,可以方便地對音頻進行編輯和處理。
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 4 output.mp3
其中,
-i input.mp4:指定輸入文件名,這里是一個視頻文件
-vn:表示不處理視頻流,只處理音頻流。
-acodec copy:表示復(fù)制音頻流,不進行重新編碼。
-acodec libmp3lame:表示將音頻流重新編碼為MP3格式。
-q:a 4:表示指定輸出音頻的質(zhì)量,值為0-9,數(shù)值越小,質(zhì)量越好,文件大小越大。
output.aac:指定輸出文件名,這里是一個AAC格式的音頻文件。
5.音視頻同步處理
音視頻同步處理是指將音頻和視頻的時間軸進行同步,使其在播放過程中達到良好的效果。在實際應(yīng)用中,由于采集設(shè)備、編碼器、網(wǎng)絡(luò)傳輸?shù)纫蛩氐挠绊懀纛l和視頻的時間軸往往會存在一定的偏差。因此,需要對音視頻進行同步處理,以保證播放效果的質(zhì)量。
在 FFmpeg 中,可以通過設(shè)置音頻和視頻的時間基(time base)和時間戳(timestamp)來實現(xiàn)音視頻同步處理。
時間基是一種時間單位,用于將時間戳轉(zhuǎn)換為實際的時間。在 FFmpeg 中,音頻和視頻的時間基可以通過音頻流和視頻流的 time_base 屬性獲取。時間戳則是指某個樣本在整個媒體流中的時間位置,一般表示為 PTS(Presentation Time Stamp)或 DTS(Decode Time Stamp)。在 FFmpeg 中,可以通過 AVPacket 結(jié)構(gòu)體中的 pts 和 dts 字段獲取時間戳。
具體的音視頻同步處理操作,可以參考以下步驟:
代碼層面
獲取音頻流和視頻流的 time_base 屬性,將其作為時間基。
AVRational audio_timebase = input_audio_stream->time_base;
AVRational video_timebase = input_video_stream->time_base;
獲取音頻流和視頻流的時鐘基準(zhǔn)值(時鐘基準(zhǔn)值指的是第一個樣本的時間戳),分別保存為 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),并根據(jù)時間差來調(diào)整音頻和視頻的時間戳。
double diff = video_clock - audio_clock;
if (diff > 0.1) {
// 視頻比音頻快,需要將音頻的時間戳加上時間差
// ...
} else if (diff < -0.1) {
// 音頻比視頻快,需要將視頻的時間戳加上時間差
// ...
}
將調(diào)整后的音頻樣本和視頻樣本寫入輸出文件。
AVFrame *audio_frame;
AVFrame *video_frame;
// 循環(huán)處理音頻樣本和視頻樣本,并寫入輸出文件
while (has_more_audio_samples || has_more_video_samples) {
if (has_more_audio_samples) {
// 處理音頻樣本
// ...
av_interleaved_write_frame(output_format_context, &
命令行
- 根據(jù)時間戳對齊音視頻
在進行音視頻合并時,需要對齊音頻和視頻的時間戳,保證它們在相同的時間播放。可以通過使用FFmpeg的"-itsoffset"參數(shù)來實現(xiàn)對齊。該參數(shù)用于指定一個時間偏移量,可以正數(shù)或負(fù)數(shù)。正數(shù)表示音頻比視頻快,負(fù)數(shù)表示視頻比音頻快。例如:
ffmpeg -i video.mp4 -itsoffset 0.5 -i audio.mp3 -c:v copy -c:a copy output.mp4
上述命令中,將音頻向后偏移0.5秒,使其與視頻對齊。
- 調(diào)整音頻速率
有時候,在進行音視頻處理時,可能需要改變音頻的播放速率??梢允褂肍Fmpeg的"atempo"過濾器來實現(xiàn)調(diào)整音頻速率。該過濾器接受一個浮點數(shù)參數(shù),表示音頻的播放速率。例如:
ffmpeg -i input.mp3 -filter:a "atempo=1.5" output.mp3
上述命令將音頻播放速率提高到1.5倍。
- 調(diào)整音頻音量
在進行音視頻處理時,有時候需要調(diào)整音頻的音量大小??梢允褂肍Fmpeg的"volume"過濾器來實現(xiàn)調(diào)整音量大小。該過濾器接受一個浮點數(shù)參數(shù),表示音頻的音量大小。例如:
ffmpeg -i input.mp3 -filter:a "volume=2.0" output.mp3
上述命令將音頻的音量調(diào)整為原來的2倍。
- 調(diào)整視頻速率
類似于調(diào)整音頻速率,有時候在進行音視頻處理時,需要調(diào)整視頻的播放速率??梢允褂肍Fmpeg的"setpts"過濾器來實現(xiàn)調(diào)整視頻速率。該過濾器接受一個時間參數(shù),表示視頻播放的速率。例如:
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
上述命令將視頻的播放速率降低到原來的一半。
- 調(diào)整視頻畫面大小
在進行音視頻處理時,有時候需要調(diào)整視頻的畫面大小??梢允褂肍Fmpeg的"scale"過濾器來實現(xiàn)調(diào)整視頻畫面大小。該過濾器接受一個字符串參數(shù),表示視頻的寬度和高度。例如:
ffmpeg -i input.mp4 -vf scale=640:360 output.mp4
上述命令將視頻的畫面大小調(diào)整為640x360。
原文 ffmpeg系列學(xué)習(xí)--FFmpeg的音視頻處理_ffmpeg itsoffset_ayou_llf的博客-CSDN博客
?文章來源地址http://www.zghlxwxcb.cn/news/detail-755933.html
★文末名片可以免費領(lǐng)取音視頻開發(fā)學(xué)習(xí)資料,內(nèi)容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音視頻學(xué)習(xí)路線圖等等。
見下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓文章來源:http://www.zghlxwxcb.cn/news/detail-755933.html
?
到了這里,關(guān)于ffmpeg系列學(xué)習(xí)——FFmpeg的音視頻處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!