# [FFmpeg] 編輯影音檔案詮釋資料 ## Metadata 選項 ffmpeg 可以使用 -metadata 標籤名稱=值 來指定各個標籤內容,而不同的封裝格式所能使用的標籤種類會有所差異,請見下列連結... https://wiki.multimedia.cx/index.php/FFmpeg_Metadata MKV封裝,指定標題與年份: ```powershell ffmpeg -i movie.m2ts -metadata title="標題" -metadata year=2010 -c copy movie.mkv ``` M4A封裝,指定標題與年份: ```bash ffmpeg -i music.aac -metadata album="專輯" -metadata artist="演出者" -metadata genre="風格" -metadata title="標題" -metadata track=1 -metadata date=2010 -c copy music.m4a ``` 重新封裝M4A,移除所有詮釋資料: ```powershell ffmpeg -i in.m4a -map_metadata -1 -c copy out.m4a ``` ### 命令提示字元 在 CMD 中指令包含有非 ANSI 字元會發生錯誤,必須先使用 `chcp 65001` 將字頁碼切換至 utf8,或者是改用 ffmpeg metadata 檔案來指定標籤內容。 ## 音樂檔封面 M4A封裝,插入封面圖片: ```powershell 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 封裝... ```powershell 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` 選項禁止輸入視訊串流 (捨棄封面圖片): ```powershell ffmpeg -vn -i music.mp3 -c:a aac music.m4a ``` 使用 `-map` 選項只選取音訊串流 (捨棄封面圖片): ```powershell ffmpeg -i music.mp3 -map a -c:a aac music.m4a ``` 使用 `-c:v copy` 複製封面封裝到輸出檔案: ```powershell ffmpeg -i music.mp3 -c:a aac -c:v copy music.m4a ``` ## 影音詮釋資料檔案 使用 ffmetadata 檔案可以大幅縮檔命令長度方便以編輯。 metadata 格式 ```ini ;這是註解 標籤名稱=值 標籤名稱=值 標籤名稱=值 ...... ``` metadata.txt ```ini album=專輯 artist=演出者 genre=風格 title=標題 track=1 date=2000 ``` 用 `-map_metadata 1` 選定第二個輸入(metadata.txt) 為詮釋資料檔案: ```powershell ffmpeg -i music.aac -i metadata.txt -map_metadata 1 -c copy music.m4a ``` 使用 ffmetadata demuxer 從影音檔匯出詮釋資料: ```powershell ffmpeg -i music.m4a -f ffmetadata metadata.txt ``` ## MP4 檔案封面圖片 將圖片 (poster.jpg) 作為封裝到 MP4: ```powershell 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)已封裝封面圖片: ```text 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重新封裝並置換封面: ```powershell 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 ``` ## MKV 檔案附件類型 將圖片 (poster.jpg) 作為附件封裝到MKV,指定為封面(filename=cover.jpg) ```powershell 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 ```powershell ffmpeg -i movie.m2ts -attach subtitlesfont.ttf -metadata:s:t mimetype=application/x-truetype-font -c copy movie.mkv ``` ## 影片檔各軌的標題與語言 MKV封裝,設定各軌標題與語言 ```powershell 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,並指定各軌標題與語言 ```powershell 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 重新封裝輸出新的影音檔。 影音檔標籤內容中文簡轉繁 ```powershell 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 ``` 批次轉換 ```cmd :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) ``` ###### tags: `ffmpeg`