---
# System prepended metadata

title: '[FFmpeg] 編輯影音檔案詮釋資料'
tags: [ffmpeg]

---

# [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`