查看完整版本: 關於ffmpeg使用教學
頁: [1]

ss665332 發表於 2017-4-30 12:05 PM

關於ffmpeg使用教學

本帖最後由 ss665332 於 2017-4-30 01:43 PM 編輯

請問如何用ffmpeg批量分離mkv檔的內嵌多軌字幕???   

已經將ffmpeg資料夾放入C槽,並在D槽建立一個用來存放檔案的test資料夾,可是cmd的參數要怎麼寫,才能將多量mkv檔的內嵌多軌字幕批量輸出到D槽的test資料夾,同時輸出檔名與原檔名相同???,請求教學,謝謝
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

antixder 發表於 2017-5-16 04:38 AM

要批量抽mkv的字幕、音軌等也可以用MKVCleaver
https://blogs.sapib.ca/apps/mkvcleaver/

ren1244 發表於 2017-5-17 12:18 AM

本帖最後由 ren1244 於 2017-5-17 12:28 AM 編輯

將下面這段存成.bat檔並執行
for /l %%i in (0 1 3)do (
forfiles /m *.mkv /c "cmd /c ffmpeg -y -i @file -map 0:s:%%i -c copy -y @fname_%%i.ass
forfiles /m *.mkv /c "cmd /c ffmpeg -y -i @file -map 0:s:%%i -c copy -y @fname_%%i.srt
)
forfiles /c "cmd /c if @fsize equ 0 (del @file)"
這會嘗試將字幕0~3用copy的方式輸出成ass及srt。
然後刪除失敗的檔案。


[*]如果你的字幕軌更多,可以把那個3改成更大的數字。(只改3喔!例如: 0 1 7)
[*]如果你的ffmpeg在其他路徑,請自行修改。例如 c:\ffmpeg\bin\ffmepg
[*]可以把這個批次檔放到D:\test\中,點兩下執行
[*]如有需要,可以再加上一行 .ssa 字幕檔格式的

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ss665332 發表於 2017-5-17 02:36 AM

本帖最後由 ss665332 於 2017-5-17 04:11 AM 編輯

ren1244 發表於 2017-5-17 01:18 AM static/image/common/back.gif
將下面這段存成.bat檔並執行
這會嘗試將字幕0~3用copy的方式輸出成ass及srt。
然後刪除失敗的檔案。

謝謝 不過這個批次檔是不是不適用於音軌的輸出??? 我將 0:s:%%i 與副檔名改掉輸出的檔案都小小的

另外還想請問 將字幕或音訊批量塞進mkv的批次檔又要怎麼寫???



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2017-5-17 03:32 AM

自動抽出音訊與字幕
    for /l %%i in (0 1 3)do (
    forfiles /m *.mkv /c "cmd /c ffmpeg -y -i @file -map 0:s:%%i -c copy -y @fname_%%i.ass
    forfiles /m *.mkv /c "cmd /c ffmpeg -y -i @file -map 0:s:%%i -c copy -y @fname_%%i.srt
    )
    for /l %%i in (0 1 3)do (
    forfiles /m *.mkv /c "cmd /c ffmpeg -y -i @file -map 0:a:%%i -c copy -y @fname_%%i.aac
    )
    forfiles /c "cmd /c if @fsize equ 0 (del @file)"這方法都是猜測裡面的東西的格式,然後再把失敗的檔案刪除
一般音訊大多都是 aac ,如果你有想到其他格式可以再加上去
(例如:mp3、wma、flac…等)

至於要把抽出來的東西塞回去,直接下指令可以一次弄出一個mkv檔案。
例如:
ffmpeg -i 01.mp4 -i 01.aac -i 01_tc.ass -i 01_eng.ass -map 0:v:0 -map 1:a:0 -map 2:s:0 -map 3:s:0 -c copy out.mkv
但要自動自己去根據檔名塞回去就要再研究了。
畢竟塞回去的東西很難用"猜"的。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

ss665332 發表於 2017-5-18 05:39 AM

本帖最後由 ss665332 於 2017-5-18 06:43 AM 編輯

我使用 FFmpeg 執行下列指令

forfiles /m *.mkv /c "cmd /c c:\ffmpeg\bin\ffmpeg -i @file -map 0:v -map 0:a:0 -c copy -y new\\@fname_pure.mkv"
forfiles /c "cmd /c if @fsize equ 0 (del @file)"
結果用 MediaInfoPortable 查詢輸出的影片卻顯示 ErrorDetectionType : Per level 1




這是什麼意思????

ren1244 發表於 2017-5-18 01:56 PM

本帖最後由 ren1244 於 2017-5-18 02:25 PM 編輯

你在4F有提到:
另外還想請問 將字幕或音訊批量塞進mkv的批次檔又要怎麼寫???
不知道是不是已經解決?其實我不是很懂細節是甚麼。
假使原檔:aaa.mkv
已抽出:aaa_0.ass、aaa_1.ass、aaa_0.aac、aaa_1.aac
接下來你想怎麼做?(如果已經無此需求以無此需求回答即可)

另外6F的問題:
結果用 MediaInfoPortable 查詢輸出的影片卻顯示 ErrorDetectionType : Per level 1
我對 MediaInfo 沒研究,但那也許不是錯誤訊息,而是一種資料格式檢查的方法。以確認信息是否有丟失。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ss665332 發表於 2017-5-18 06:02 PM

本帖最後由 ss665332 於 2017-5-18 07:05 PM 編輯

不知道是不是已經解決?其實我不是很懂細節是甚麼。
假使原檔:aaa.mkv
已抽出:aaa_0.ass、aaa_1.ass、aaa_0.aac、aaa_1.aac
接下來你想怎麼做?(如果已經無此需求以無此需求回答即可)
就是將抽出的字幕或音軌塞回mkv檔裡

我執行下列批次檔 可是無法成功

cmd /c e:\ffmpeg\bin\ffmpeg -i aaa.mkv -i aaa.aac -i aaa.ass -i -map 0:v:0 -map 1:a:0 -map 2:s:0 -map 3:s:0 -c copy -y aaa_new.mkv
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2017-5-19 12:23 AM

本帖最後由 ren1244 於 2017-5-19 01:08 AM 編輯

將以下內容存成bat檔,跟mkv檔放在一起,點bat檔執行
@echo off
REM ==========================
REM ========  設定區  ========
REM ==========================
REM 這邊設定 ffmpeg所在路徑(最後不加斜線)
set ffmpeg_path=C:\ffmpeg\bin
REM 字幕軌、音軌所在之子資料夾(最後加斜線)
set stream_dir=new\
REM 這邊設定要抓的音軌編號(0是第一個)
set audio_track=0
REM 這邊設定要抓的字幕軌編號(0是第一個)
set subtitle_track=0
REM ==========================
REM ========以下請勿更動========
REM ==========================
set PATH=%ffmpeg_path%;%PATH%
IF (%1)==() (
for %%f in (*.mkv) do @aaa.bat %%f
EXIT
)
set fname=%1
set fname=%fname:~0,-4%
if exist %stream_dir%%fname%_%subtitle_track%.ass (goto ass)
if exist %stream_dir%%fname%_%subtitle_track%.srt (goto srt) else (goto err_s)
:ass
set first_s=%stream_dir%%fname%_0.ass
goto go_on
:srt
set first_s=%stream_dir%%fname%_0.srt
goto go_on
:go_on
if exist %stream_dir%%fname%_%audio_track%.aac (goto aac)
if exist %stream_dir%%fname%_%audio_track%.wma (goto wma) else (goto err_a)
:aac
set first_a=%stream_dir%%fname%_0.aac
goto go_no2
:wma
set first_a=%stream_dir%%fname%_0.wma
goto go_no2
:go_no2
ffmpeg -y -i %1 -i %first_a% -i %first_s% -map 0:v:0 -map 1:a:0 -map 2:s:0 -c copy %fname%_new.mkv
goto eof
:err_a
echo %1 ...cannot find audio track
goto err
:err_s
echo %1 ...cannot find subtitle track
goto err
:err
pause
:eof設定選項說明:

[*]REM後面只是註解,更動的是「下一行等號後面」的值
[*]ffmpeg_path:ffmpeg存放的路徑
[*]stream_dir:先前分離出的字幕軌與音軌所在資料夾(mkv檔的相對路徑),如果跟mkv檔放在一起,這邊留空值即可(也就是刪掉 new\ )
[*]audio_track跟subtitle_track:雖然你是要第一個軌道,但我乾脆多這個選項讓你用了

PS.弄成這樣整個很像在寫程式了...

以下補充你在上一樓寫法出現的問題:

cmd /c e:\ffmpeg\bin\ffmpeg -i aaa.mkv -i aaa.aac -i aaa.ass -i -map 0:v:0 -map 1:a:0 -map 2:s:0 -map 3:s:0 -c copy -y aaa_new.mkv


[*] -i 後面一定要接一個輸入的檔案
[*] 你只有3個檔案,編號是0、1、2,所以 -map 3:s:0 會出錯,因為那個3要對應到第4個輸入的檔案
[*] 另外,沒使用 forfiles時,cmd /c其實是多餘的,你可以直接從 e:\ffmp... 開始輸入。





...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ss665332 發表於 2017-5-19 11:35 AM

本帖最後由 ss665332 於 2017-5-19 02:18 PM 編輯

ren1244 發表於 2017-5-19 01:23 AM static/image/common/back.gif
將以下內容存成bat檔,跟mkv檔放在一起,點bat檔執行
設定選項說明:


這看起來好厲害 但是我照大神的寫法 批次檔無法執行?
REM ========  設定區  ========
REM ==========================
REM 這邊設定 ffmpeg所在路徑(最後不加斜線)
set ffmpeg_path=e:\ffmpeg\bin  改的也只有這裡
REM 字幕軌、音軌所在之子資料夾(最後加斜線)
set stream_dir=new\
REM 這邊設定要抓的音軌編號(0是第一個)
set audio_track=0
REM 這邊設定要抓的字幕軌編號(0是第一個)
set subtitle_track=0




...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

ss665332 發表於 2017-5-19 03:37 PM

本帖最後由 ss665332 於 2017-5-19 04:41 PM 編輯

我把寫的批次檔貼上來 大神您看看

http://pan.baidu.com/s/1dFMQvAh

ss665332 發表於 2017-5-28 04:41 AM

ren1244 發表於 2017-5-19 01:23 AM static/image/common/back.gif
將以下內容存成bat檔,跟mkv檔放在一起,點bat檔執行
設定選項說明:



想問大神 能不能用ffmpeg抽出mkv的章節,如果可以參數要怎麼下??
頁: [1]