ffmpeg 可以使用 -metadata 標籤名稱=值 來指定各個標籤內容,而不同的封裝格式所能使用的標籤種類會有所差異,請見下列連結…
https://wiki.multimedia.cx/index.php/FFmpeg_Metadata
MKV封裝,指定標題與年份:
ffmpeg -i movie.m2ts -metadata title="標題" -metadata year=2010 -c copy movie.mkv
M4A封裝,指定標題與年份:
ffmpeg -i music.aac -metadata album="專輯" -metadata artist="演出者" -metadata genre="風格" -metadata title="標題" -metadata track=1 -metadata date=2010 -c copy music.m4a
重新封裝M4A,移除所有詮釋資料:
ffmpeg -i in.m4a -map_metadata -1 -c copy out.m4a
在 CMD 中指令包含有非 ANSI 字元會發生錯誤,必須先使用 chcp 65001
將字頁碼切換至 utf8,或者是改用 ffmpeg metadata 檔案來指定標籤內容。
M4A封裝,插入封面圖片:
ffmpeg -i music.flac -i cover.jpg -map 0 -map 1:0 -c:a aac -c:v copy -id3v2_version 4 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" music.m4a
將帶有封面的音樂檔案轉成其他音訊檔案格式時會發生錯誤,這是由於 ffmpeg 會將封面圖片重新編碼,但音訊檔案格式無法封裝視訊串流。
例如,將一個帶有封面的 mp3 重新編碼為 aac 以 m4a 封裝…
ffmpeg -i music.mp3 -c:a aac music.m4a
Input #0, mp3, from 'music.mp3':
Duration: 00:03:28.01, start: 0.025056, bitrate: 322 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s
Stream #0:1: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 350x298 [SAR 100:100 DAR 175:149], 90k tbr, 90k tbn, 90k tbc (attached pic)
Stream mapping:
Stream #0:1 -> #0:0 (mjpeg (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (mp3 (mp3float) -> aac (native))
[ipod @ 0000018f08266880] Could not find tag for codec h264 in stream #0, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
上述例子封面圖片被轉成 h.264 視訊串流而導致錯誤,此時有以下幾種解決方式…
使用 -vn
選項禁止輸入視訊串流 (捨棄封面圖片):
ffmpeg -vn -i music.mp3 -c:a aac music.m4a
使用 -map
選項只選取音訊串流 (捨棄封面圖片):
ffmpeg -i music.mp3 -map a -c:a aac music.m4a
使用 -c:v copy
複製封面封裝到輸出檔案:
ffmpeg -i music.mp3 -c:a aac -c:v copy music.m4a
使用 ffmetadata 檔案可以大幅縮檔命令長度方便以編輯。
metadata 格式
;這是註解
標籤名稱=值
標籤名稱=值
標籤名稱=值
......
metadata.txt
album=專輯
artist=演出者
genre=風格
title=標題
track=1
date=2000
用 -map_metadata 1
選定第二個輸入(metadata.txt) 為詮釋資料檔案:
ffmpeg -i music.aac -i metadata.txt -map_metadata 1 -c copy music.m4a
使用 ffmetadata demuxer 從影音檔匯出詮釋資料:
ffmpeg -i music.m4a -f ffmetadata metadata.txt
將圖片 (poster.jpg) 作為封裝到 MP4:
ffmpeg -i movie.mp4 -i poster.jpg -map 0 -map 1:0 -c copy -disposition:v:1 attached_pic movie_remux.mp4
假設有一MP4檔(movie.mp4)已封裝封面圖片:
Stream #0:0(jpn): Video: h264
Stream #0:1(jpn): Audio: aac
Stream #0:2: Video: mjpeg
由以上可以封面圖為 Stream #0:2
即 0:v:1
,若要捨棄封面,用 -map
選取封面以外的串流可。
承上,將帶有封面的MP4重新封裝並置換封面:
ffmpeg -i movie.mp4 -i poster.jpg -map 0:v:0 -mpa 0:a -map 1:0 -c copy -disposition:v:1 attached_pic movie_remux.mp4
將圖片 (poster.jpg) 作為附件封裝到MKV,指定為封面(filename=cover.jpg)
ffmpeg -i movie.m2ts -attach poster.jpg -metadata:s:t mimetype=image/jpeg -metadata:s:t filename=cover.jpg -c copy movie.mkv
將字型 (subtitlesfont.ttf ) 作為附件封裝到MKV
ffmpeg -i movie.m2ts -attach subtitlesfont.ttf -metadata:s:t mimetype=application/x-truetype-font -c copy movie.mkv
MKV封裝,設定各軌標題與語言
ffmpeg -i movie.m2ts -i cht.ass -i eng.ass -map 0:v -map 0:a:0 -map 1:s -map 2:s `
-metadata:s:a:0 language=eng `
-metadata:s:s:0 language=chi -metadata:s:s:0 title="zh-Hant, ASS" `
-metadata:s:s:1 language=eng -metadata:s:s:0 title="en-US, ASS" `
-c copy movie.mkv
將字幕、字型、封面封裝到MKV,並指定各軌標題與語言
ffmpeg -i movie.m2ts -i chi.ass -attach subtitlesfont.ttf -attach poster.jpg `
-map 0:v -map 0:a:0 -map 1:s `
-metadata title="Movie Title" -metadata year=2020 `
-metadata:s:a:0 language=eng `
-metadata:s:s:0 language=chi -metadata:s:s:0 title="zh-Hant, ASS" `
-metadata:s:t:0 mimetype=application/x-truetype-font `
-metadata:s:t:1 mimetype=image/jpeg -metadata:s:t:1 filename=cover.jpg `
-c copy movie.mkv
使用 ffmpeg 從影音檔匯出 metadata 檔案給 OpenCC 轉換,再用 ffmpeg 重新封裝輸出新的影音檔。
影音檔標籤內容中文簡轉繁
ffmpeg -i music.mp3 -f ffmetadata - | opencc -c s2tw.json -o metadata.txt
ffmpeg -i music.mp3 -i metadata.txt -map_metadata 1 -c copy music_remux.mp3
批次轉換
:Loop
ffmpeg -i "%~1" -f ffmetadata - | opencc -c s2tw.json >"%~1.metadata.txt"
ffmpeg -i "%~1" -i "%~1.metadata.txt" -map_metadata 1 -c copy "%~dpn1_remux%~x1"
if not "%~2" == "" (shift /1 &goto :Loop)
ffmpeg