目錄
ffmpeg下載
使用ffmpeg從視頻文件中提取音頻文件
批量提取文件夾下多個視頻文件的音頻
使用ffmpeg從視頻文件中提取視頻幀
使用ffmpeg將按固定時長將視頻切割成多個小片段
將分割得到的視頻存放在新建文件夾下(這個我運(yùn)行的時候好像有點(diǎn)問題,音頻文件沒有存放在新建的文件夾中)
批量處理多個視頻
將輸出文存儲在文件夾中,命名與原視頻一致
ffmpeg下載
先下載ffmpeg軟件,可以參考下面這個鏈接,下載不了可以參考里面的評論區(qū),我下載的時候參考過評論區(qū)的方法
Windows下下載安裝ffmpeg - 知乎 (zhihu.com)
使用ffmpeg從視頻文件中提取音頻文件
MP3文件和WAV文件都是數(shù)字音頻格式,由于兩者的壓縮比例和編碼上面的差異,因此但是兩者在文件大小和音質(zhì)上有所不同。WAV是最接近無損的音樂格式,MP3文件通過對音頻進(jìn)行編碼,去掉了某些部分,從而節(jié)省了空間。
使用 -f wav 輸出wav格式音頻文件:
E:\>ffmpeg -i test.mp4 -vn -f wav output.wav
使用 -f mp3 輸出mp3格式音頻文件:
E:\>ffmpeg -i test.mp4 -vn -f mp3 output.mp3
使用 -c:a mp3 輸出mp3格式音頻文件:?
E:\>ffmpeg -i test.mp4 -vn -c:a mp3 output.mp3
試了一下提取mp3文件比提取wav文件慢一些,也不清楚兩種提取mp3文件的方法有什么區(qū)別
- ?-i???輸入文件,test.mp4?為原始視頻文件;
- ?-vn? 表示no video,輸出不包含視頻
- ?-f???輸出文件格式
- output.mp3 /output.wav為處理結(jié)果文件;
批量提取文件夾下多個視頻文件的音頻
在該目錄下創(chuàng)建一個批處理文件(例如 music.bat)
在批處理文件中添加以下命令:
for %%a in (*.mp4) do ffmpeg -i %%a -vn -f wav %%~na.wav
使用ffmpeg從視頻文件中提取視頻幀
ffmpeg -i output_000.mp4 -r 8 -f image2 ./%05d.jpg
ffmpeg -i output_000.mp4 -vf fps=fps=8 -f image2 ./%05d.jpg
上面兩個指令都可以
其中 -r 8 和 -vf fps=fps=8 均表示按 fps = 8 進(jìn)行抽幀?
得到的結(jié)果如下圖所示,但是我是將10s的視頻進(jìn)行提取,按理說應(yīng)該是10*8=80幀,但是最終剛得到的是86張圖片,這個10s的視頻是按照下面的方法將大視頻按照固定時長(10s)切割成小片段得到的,不太清楚這是怎么回事。
使用ffmpeg將按固定時長將視頻切割成多個小片段
ffmpeg -i input_video.mp4 -c copy -map 0 -segment_time 60 -f segment output_%03d.mp4
這個命令將會把 "input_video.mp4" 這個視頻按照60秒的時長切割成多個小片段,每個小片段保存在以 "output_001.mp4", "output_002.mp4", "output_003.mp4" ...等格式命名的文件中。
命令的解釋:
-
-i input_video.mp4
: 輸入視頻文件的路徑和文件名。 -
-c copy
: 使用“copy”編解碼器,將視頻從輸入直接復(fù)制到輸出,不做任何修改。 -
-map 0
: 將輸入文件中的所有流全部復(fù)制到輸出文件中。 -
-segment_time 60
: 視頻分段的時間長度,這里設(shè)置為60秒。 -
-f segment
: 指定輸出格式為分段的視頻格式。 -
output_%03d.mp4
: 輸出文件的名稱格式,%03d 表示輸出文件名以 3 位數(shù)字為格式,例如 output_001.mp4。
這個命令將會在同級目錄下生成一系列的小片段視頻文件,可以根據(jù)需要自定義參數(shù)來滿足需求。
請注意,上述示例中的命令行參數(shù) -c copy
表示使用“copy”編解碼器,將視頻從輸入直接復(fù)制到輸出,不做任何修改。如果你需要對視頻進(jìn)行轉(zhuǎn)碼或其他處理,請根據(jù)需要修改命令行參數(shù)。
將分割得到的視頻存放在新建文件夾下(這個我運(yùn)行的時候好像有點(diǎn)問題,音頻文件沒有存放在新建的文件夾中)
import os
import subprocess
input_video = "input_video.mp4"
output_folder = os.path.splitext(input_video)[0] # 獲取文件名去掉擴(kuò)展名的部分作為輸出文件夾名
os.makedirs(output_folder, exist_ok=True) # 創(chuàng)建輸出文件夾,如果已經(jīng)存在則不會報(bào)錯
command = ["ffmpeg", "-i", input_video, "-c", "copy", "-map", "0", "-segment_time", "60", "-f", "segment", os.path.join(output_folder, f"{input_video}_%03d.mp4"), "-reset_timestamps", "1", "-strftime", "1", "-v", "warning", "-stats", "-hide_banner", "-nostdin", "-y", "-vcodec", "copy", "-acodec", "copy", "-copyts", "-avoid_negative_ts", "make_zero"]
subprocess.run(command)
批量處理多個視頻
首先,將 ffmpeg.exe 和所有需要處理的視頻文件放在同一個目錄下。
然后,在該目錄下創(chuàng)建一個批處理文件(例如 batch_process.bat)。
在批處理文件中添加以下命令:
for %%a in (*.mp4) do ffmpeg -i "%%a" -c copy -map 0 -segment_time 60 -f segment "output_%%~na_%%03d.mp4"
這個命令將對該目錄下的所有 mp4 文件進(jìn)行處理。假設(shè)我們有一個名為 "video1.mp4" 的視頻文件,該命令將生成以下文件:
- output_video1_001.mp4
- output_video1_002.mp4
- output_video1_003.mp4
- ...
其中 "video1" 是輸入文件的名稱。
保存并運(yùn)行該批處理文件,它將會自動對目錄下的所有 mp4 文件進(jìn)行處理,生成相應(yīng)的分段視頻文件。
注意:如果視頻文件不是以 mp4 格式結(jié)尾,可以將 *.mp4
替換為相應(yīng)的格式。同時,如果需要修改分段視頻文件的命名格式,可以根據(jù)自己的需求修改輸出文件名的格式。
將輸出文存儲在文件夾中,命名與原視頻一致
import glob
import os
import subprocess
def split_video(input_file, duration):
output_folder = os.path.splitext(input_file)[0]
if not os.path.exists(output_folder):
os.makedirs(output_folder)
command = ['ffmpeg', '-i', input_file, '-c', 'copy', '-f', 'segment', '-reset_timestamps', '1', '-segment_time',
str(duration), '-map', '0', os.path.join(output_folder, 'output_%03d.mp4')]
subprocess.call(command)
if __name__ == '__main__':
duration = 10 # 單位是秒,這里設(shè)置每個片段的時長為10秒
input_folder = r"E:\video"
for input_video in glob.glob(os.path.join(input_folder, "*.mp4")):
split_video(input_video, duration)
下面是代碼運(yùn)行的效果?
文章來源:http://www.zghlxwxcb.cn/news/detail-401705.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-401705.html
到了這里,關(guān)于使用ffmpeg從視頻文件中提取音頻文件、視頻抽幀和切割視頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!