psx boot system install

Installing Debian using network booting

 

 

Preface

Installation using network booting must not be confused with DebianNetworkInstall. In network install, you start with a CD (or USB flash memory or similar) to install a minimal Linux system before you proceed to download further packages over the network.

Installation using network booting is also different from using the network to boot an already-installed system: in which case, the client machine remains dependent on the server being up and running at every future boot. The Linux Terminal Server Project (LTSP) works like that, for example.

This page describes installing a new Debian system with no CD, DVD, USB at all. By the end of the installation process, the new machine is able to run without the support of the server. During the installation, you will need a network boot server.

As there are no fiducial boot servers out in the wild, you need to set up your own. This is considerably more complicated than installing Debian from CD (shorthand for CD or USB or …). Normally, network booting is only used if there is really no way to boot from CD. If booting from CD fails, this may be due to BIOS problems that will equally prevent network booting (typical troubleshooting attempts include switching off secure booting, switching from UEFI to legacy boot mode, and similar).

In the Web, several articles can be found that describe in more or less detail how to setup a network boot server. They all have the same weakness: you are required to execute a long list of instructions without getting any feedback before the very end of the procedure when you try to boot. If it works, fine. If not, debugging will become very very difficult. Therefore, in the following, we break down the procedure into steps that can be debugged separately.

 

http://www.debian.org/releases/stable/amd64/ch04s05 – Debian Installation Guide – 4.5. Preparing Files for TFTP Net Booting

Note: If your system supports iPXE, then using netboot.xyz is likely to be much simpler.

 

Preconditions

The computer you want to install to will be called the Client.

The computer you install from will be called the Server. We assume that the Server is running Debian.

To be specific, we assume that the Client and the Server are part of a LAN with the following IP addresses:

  • 192.168.0.1 router (i.e. LAN default gateway) and DNS recursive server
  • 192.168.0.2 the Server (will host a DHCP and TFTP server)
  • 192.168.0.x the Client

You will find out the value of x later.

Note that many routers also provide a DHCP server: you will have to turn it off, since only one DHCP server can run in a given LAN. Unless you may configure your router’s DHCP server to comply with the ISC DHCP server configuration below, but this is outside of the scope of this document.

It is also possible that the router and the server are the same machine, i.e. that your Debian server is the default gateway for this LAN. This will work fine.

The following instructions have been tested with Debian 8.2 (Jessie) in September 2015.

 

Activate PXE boot

Setup the BIOS boot menu of the Client to boot from the network.

Reboot. On most systems, this produces an output that contains the Client’s MAC address. Then, it will fail with

  PXE-E53: no boot filename received.

Note the MAC address; it will be helpful for interpreting log messages.

On many servers, it is also possible to temporary switch to PXE boot without permanently changing the BIOS settings. There will be some kind of keystroke to hit during BIOS POST. On Dell servers, F12 will do the trick (or Esc then @ from a serial or IPMI console).

 

Set up DHCP server

On the Server, we need to set up a DHCP server.

Current best practice seems to be to use the package isc-dhcp-server, which provides a daemon dhcpd.

Its configuration file is /etc/dhcp/dhcpd.conf. Modify this file so that it contains about the following; adapt IP and MAC addresses to your local needs:

 

default-lease-time 600;
max-lease-time 7200;

allow booting;

# in this example, we serve DHCP requests from 192.168.0.(3 to 253)
# and we have a router at 192.168.0.1
subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.3 192.168.0.253;
  option broadcast-address 192.168.0.255;
  option routers 192.168.0.1;             # our router
  option domain-name-servers 192.168.0.1; # our router has DNS functionality
  next-server 192.168.0.2;                # our Server
  filename "pxelinux.0"; # setting a default, might be wrong for "non defaults"
}

group {
  next-server 192.168.0.2;                # our Server
  host tftpclient {
    # attempt to provide better match for architecture and bootfile
    if option architecture-type = 00:07 {
      filename "debian-installer/amd64/bootnetx64.efi";
    } else {
      filename "pxelinux.0";
    }
  }
}

After each modification of the above, restart the DHCP server with

  # /etc/init.d/isc-dhcp-server restart

or with the systemd equivalent

  # systemctl restart isc-dhcp-server

Check that it is actually running:

  # pgrep -lf dhcpd
  32277 /usr/sbin/dhcpd -q

or

  # systemctl status isc-dhcp-server

which gives slightly more information.

Before rebooting the client, you may like to run

  # journalctl -fu isc-dhcp-server

which shows you the last few lines of the DHCP server log, then updates the screen with each new log entry. (If you do not want to “follow” the log, just leave out the “f”)

Reboot the Client. On success, it will output the IP addresses of the Server (“DHCP”), of the router (“Gateway”) and of itself (192.168.0.x). Then it will hang with a TFTP request, and finally write the error message:

  PXE-E32: TFTP open timeout

and at the same time, you will see log messages on the server screen showing the DHCP requests and offers similar to the output below the alternative command below

If you prefer not to use systemd, or wish to compare the traditional log output for diagnostic purposes, you can look up /var/log/syslog, for example with this command

  # grep DHCP /var/log/syslog
  • where you should see something like:

 

Jun  3 09:53:46 server dhcpd: DHCPDISCOVER from 40:01:1c:47:44:1e via eth0
Jun  3 09:53:47 server dhcpd: DHCPOFFER on 192.168.0.3 to 40:01:1c:47:44:1e via eth0
Jun  3 09:53:51 server dhcpd: DHCPREQUEST for 192.168.0.3 (192.168.0.2) from 40:01:1c:47:44:1e via eth0
Jun  3 09:53:51 server dhcpd: DHCPACK on 192.168.0.3 to 40:01:1c:47:44:1e via eth0

(Note that earlier Debian releases used /var/log/daemon.log instead of syslog)

If nothing appears in the log with either command, check the network links between the Server and the Client. Note that some network switches may impose severe limitations on DHCP traffic; for Cisco ones, use ‘portfast’ if possible (see http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a00800b1500.shtml).

 

Set up TFTP server

Next, we need to set up a TFTP server on the Server.

Again, there are several packages that provide TFTP (trivial FTP, unsafe, to be used in LAN’s only). It seems best practice to use the package tftpd-hpa. On installation, a few questions are asked. The response to these questions goes into a configuration file, /etc/default/tftpd-hpa. There should be no need to modify the following default contents:

 

  TFTP_USERNAME="tftp"
  TFTP_DIRECTORY="/srv/tftp"
  TFTP_ADDRESS="0.0.0.0:69"
  TFTP_OPTIONS="--secure"

Ignore older Web sites that instruct you to insert something like ‘RUN_DAEMON=”yes”‘.

After each modification of the above configuration file, restart the TFTP server with

  # /etc/init.d/tftpd-hpa restart

or

  # systemctl restart tftpd-hpa

On Jessie, the directory /srv/tftp will be automatically created. This means the next two steps are not necessary if you use Jessie.

Initially, on pre-Jessie versions, restarting the TFTP server might fail with a message like

  Restarting HPA's tftpd: in.tftpd/srv/tftp missing, aborting.

Therefore, as root, create the directory /srv/tftp. Restart the TFTP daemon. Check that it is actually running:

  # pgrep -lf tftpd
  12555 /usr/sbin/in.tftpd

or

  # systemctl status tftpd-hpa

which again gives a few lines of the log rather than just the fact that the task is (isn’t) running.

It is useful to test your TFTP server with a TFTP client; you may simply use the tftp-hpa package for this purpose:

  # cd /tmp
  # uname -a >/srv/tftp/test
  # tftp 192.168.0.2
  tftp> get test
  tftp> quit
  # diff test /srv/tftp/test
  (nothing, they are identical)

It is also useful to see what log entries you get when you download a file that exists, and when you try to download one that doesn’t. While using tftp to test your tftpd server, try tracking your experiments with old and new forms of the log command while you are using your TFTP client to download files that do, as well as files that do not, exist.

The traditional command on Jessie

  # tail -f /var/log/syslog

(Note again that earlier Debian releases used /var/log/daemon.log instead of syslog.)

On systemd

  # journalctl -fu tftpd-hpa

Sadly, these seem to give different results, as of January 2017. The systemd command does not display file requests for files that do not exist.

It is quite useful to know what the client is asking for, as it helps you move files to the expected location if you make mistakes later on. At present then it is probably worth using the traditional way of log tracking for TFTPD.

Reboot the Client. You should see error messages on the client screen starting with

  PXE-T01: File not found

which is quite correct since we did not yet provide any files. On the server screen, you will see exactly what the client did ask for.

 

Provide the boot image

Download netboot/netboot.tar.gz from a Debian mirror (see http://www.debian.org/distrib/netinst#netboot).

To add firmware into your initrd.gz see : https://wiki.debian.org/DebianInstaller/NetbootFirmware

Optional: To verify the digital signature, type these commands:

# export YOURMIRROR=deb.debian.org # A CDN backed by cloudflare and fastly currently
# export ARCH=amd64
# export DIST=stable
# wget http://"$YOURMIRROR"/debian/dists/$DIST/main/installer-"$ARCH"/current/images/netboot/netboot.tar.gz
# wget http://"$YOURMIRROR"/debian/dists/$DIST/main/installer-"$ARCH"/current/images/SHA256SUMS
# wget http://"$YOURMIRROR"/debian/dists/$DIST/Release
# wget http://"$YOURMIRROR"/debian/dists/$DIST/Release.gpg

# sha256sum -c <(awk '/netboot\/netboot.tar.gz/{print $1 " netboot.tar.gz"}' SHA256SUMS)
# # Must print: netboot.tar.gz: OK


# sha256sum -c <(awk '/[a-f0-9]{64}[[:space:]].*main\/installer-'$ARCH'\/current\/images\/SHA256SUMS/{print $1 " SHA256SUMS"}' Release)

# # Must print `SHA256SUMS: OK`

# gpg --verify Release.gpg Release
gpg: WARNING: multiple signatures detected.  Only the first will be checked.
gpg: Signature made Sat 15 Jun 2013 05:55:56 AM CDT using RSA key ID 473041FA
gpg: Good signature from "Debian Archive Automatic Signing Key (6.0/squeeze) <ftpmaster@debian.org>"

Unpack netboot.tar.gz to /srv/tftp, which should now contain

  debian-installer/
  pxelinux.0@
  pxelinux.cfg@
  version.info

It may be necessary to chmod -R a+r * to make all files in this directory readable for the TFTP daemon.

If you are booting with UEFI, you should link grub and grubx64.efi into the root of your tftp directory:

# cd /srv/tftp
# ln -s debian-installer/amd64/grubx64.efi .
# ln -s debian-installer/amd64/grub .

You may also have to edit grub/grub.cfg in order to set your serial console, if needed (I replaced the section about the graphical terminal):

serial --speed=115200 --unit=1 --word=8 --parity=no --stop=1
terminal_input console serial
terminal_output console serial

as well as the serial console for debian-installer by appending this to the kernel command line:

console=ttyS1,115200n8r console=tty1

Restart the TFTP daemon, and again you may like to follow the log entries as they appear

  # tail -f /var/log/syslog

HISTORICAL NOTE: /var/log/syslog is right for Jessie — in earlier Debian versions, if this does not seem to work, also try /var/log/daemon.log

then reboot the Client. You should get to a Debian install screen.

If you lookup into /var/log/syslog, you will see what has been downloaded from the TFTP server by the PXE bootloader, and then by SYSLINUX. You might also see some “NAK” replies when SYSLINUX asked for files that do not exist (it tries several locations for some important files).

Jun  3 09:53:51 server tftpd.in[32698]: Serving pxelinux.0 to 192.168.0.3:2070
Jun  3 09:53:51 server tftpd.in[32698]: Serving pxelinux.0 to 192.168.0.3:2071
Jun  3 09:53:51 server tftpd.in[32698]: Serving pxelinux.cfg/44454c4c-5600-1048-8051-c7c04f575831 to 192.168.0.3:57089
Jun  3 09:53:51 server tftpd.in[32698]: Serving pxelinux.cfg/40-01-b1-1c-47-44-1e to 192.168.0.3:57090
Jun  3 09:53:51 server tftpd.in[32698]: Serving pxelinux.cfg/default to 192.168.0.3:57090
Jun  3 09:53:51 server tftpd.in[32698]: Serving bootmenu.txt to 192.168.0.3:57095

The PXE loader (the firmware in the BIOS or the network controller of the client) tries to load in this order:

  • pxelinux.0 (or more exactly, what you told it to download in the ‘filename’ field of the DHCP response)

Then SYSLINUX/PXELINUX will try to search its configuration at different paths, from the most specific to the least:

  • pxelinux.cfg/GUID
  • pxelinux.cfg/MAC
  • pxelinux.cfg/default

And if the configuration menu depends on other configuration items, they are also downloaded. Debian will at least need the ‘bootmenu.txt’ file which is the main menu.

By default, you arrive at the graphical Debian install start menu screen. Press ‘enter’ to start installation. Be patient: it may take over a minute before the next screen (‘Select a language’) appears.

 

Alternative way to obtain the boot image

If you have a Debian system of the same release as you wish to install, you can install the boot image using apt.

 

VERSION=8 # jessie, 7.0 for wheezy
ARCH=amd64 # or any other release architecture
apt-get install debian-installer-$VERSION-netboot-$ARCH

Now point the tftp server to /usr/lib/debian-installer/images/$VERSION/$ARCH/$INTERFACE where INTERFACE=text for the text mode installer or INTERFACE=gtk for the graphical installer. A simple way to achieve this is to turn /srv/tftp into a symbolic link.

 

Simple way – using Dnsmasq

dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP server with BOOTP/TFTP/PXE functionality. That is, you can replace isc-dhcp-server and tftpd-hpa with Dnsmasq.

Following is the /etc/dnsmasq.conf providing the same functionality as the method of installing and configuration of isc-dhcpd-server and tftpd-hpa described above.

 

interface=eth1
domain=yourdomain.com
dhcp-range=192.168.0.3,192.168.0.253,255.255.255.0,1h
dhcp-boot=pxelinux.0,pxeserver,192.168.0.2
enable-tftp
tftp-root=/srv/tftp
pxe-service=x86PC, "PXELINUX (BIOS)", "pxelinux.0"
pxe-service=X86-64_EFI,"PXE (UEFI)","grubx64.efi"

# other UEFI type identifier, see RFC4578 section-2.1

pxe-service=2, "PXELINUX (0002-EFI)", "grubx64.efi"
pxe-service=6, "PXELINUX (0006-EFI)", "grubx64.efi"
pxe-service=7, "PXELINUX (0007-EFI)", "grubx64.efi"
pxe-service=8, "PXELINUX (0008-EFI)", "grubx64.efi"
pxe-service=9, "PXELINUX (0009-EFI)", "grubx64.efi"

Download the netboot.tar.gz and extract it in the /srv/tftp as previous description or for Bookworm :

 

cd /srv/
mkdir tftp
cd /srv/tftp
wget http://ftp.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzvf netboot.tar.gz
rm netboot.tar.gz
ln -s debian-installer/amd64/grubx64.efi .
ln -s debian-installer/amd64/grub .

To add firmware into your initrd.gz see : NetbootFirmware

Restart dnsmasq :

 

systemctl restart dnsmasq

 

Potential Issues

If the kernel in the netboot image gets out of sync with the kernel module packages, then the modules won’t load and the install will fail, the usual symptoms are that messages about “missing symbols” appear in the ctrl-alt-f4 console.

To fix this, update the kernel and initrd on the netboot server.

There is probably a Debian BTS issue open for this, but I can’t find it now.

ffmpeg & mp4tags コマンドライン

Access from '3.144.224.105'
You are in US.
It is 18:54 JST now.

ffmpeg  mp4tags


Ubuntu 22.04 , Debian 12 でも mp4tags など mp4v2 ユーティリティを使用

mp4tags コマンドは ffmpeg で Video のタイトルなどマメに設定するのは骨がおれるので mp4tagsを騙し、騙し、Ubuntu 18 のコマンドを使用してきただが、調べてみると当時と比べかなりバージョンが上がっている(当たり前だが・・・)
そこでVersion 2.5.0.1 の debパッケージを作成したので好みで ダウンロードしてみてください。
インストールは簡単で sudo dpkg -i  [ダウンロードしたファイル] で可能です。 ちなみに こちらの環境では debian 12,  ubuntu 22.04で動作しています。

コマンドライン使用法

ffmpeg の基本である動画形式の変換です。

トランスコード

基本となるトランスコーダー的使い方について説明する。トランスコードとは、符号化してあるものを一旦復号化し、別の形式で符号化しなおす処理全般のことを言う。書式は以下の通り。

ffmpeg INPUT_OPTIONS -i INPUT_FILE OUTPUT_OPTIONS OUTPUT_FILE

入力ファイルと出力ファイルを指定して、あとは適宜オプションを指定すればよい。基本的にはそれだけである。例えば、AVI を MP4 に変換するには、

ffmpeg -i input.avi output.mp4

とすればよい。実際これで動くわけだが、これだと出力のコーデックがどうなっているのか、ビットレートはどうなのか、何も分からない。これらの不足している情報は自動的に補われ、例えばこの場合だと、出力のコーデックはおそらく H.264 になるものと思われる。

出力のビットレート等を具体的に指定したくなったときに使うのが出力オプションである。例えば動画のビットレートを 2 Mbps にしたいのであれば、

ffmpeg -i input.avi -b:v 2M output.mp4

とすればよい。もちろん1パス処理なので正確にこの値になるわけではないが、ある程度コントロールできる。では入力のオプションは何に使うのかと言うと、フォーマットに含まれていない情報を補ったり、それを上書きしたりするときに使う。また、純粋なトランスコード以外の簡単な加工、例えば動画サイズ変更、を行うオプションも存在する。

主要オプション解説

以下、主要なオプションについて簡単に解説する。/ で区切られているのは同じオプションの表記違い、(in), (out), (in/out) はそれぞれ、入力用オプション、出力用オプション、両方に使用可能なオプションを意味する。

フォーマット指定: -f (in/out)

フォーマットを指定するオプションだが、ほぼ100%拡張子から判定できるので、よほど変なことをしようと思わない限り基本的には不要。変なことというのは、例えば拡張子が avi の MP4 ファイルを作るなど。使う可能性があるものとしては、複数の動画を結合する際に使う concat と、RAW データを表す rawvideo がある。

コーデック指定: -c:v / -codec:v / -vcodec (in/out)

v の部分はビデオを意味する。同様にして、音声コーデックは -c:a で指定できる。動画も音声もまとめて扱う際は、-c とすればよい。使うことが多いと思われるコーデックをいくつか挙げておく。

ffmpeg での表記 対応するコーデック
libx264 OR h264 H.264 / AVC
libx265 OR hevc H.265 / HEAV
mpeg4 MPEG-4 Part 2
mpeg2video MPEG-2 Part 2
rawvideo RAW

MPEG-1 は古すぎるので、MPEG-3 は存在しないので挙げていない。H.264 と H.265 については、libx264 と libx265 がエンコーダー、h264 と hevc がデコーダーに対応する。仕様可能なコーデック一覧は、

ffmpeg -codecs

で取得できる。

動画の長さの指定: -t (in/out)

動画を指定した長さで打ち切ることができる。単位は秒。入力と出力に適応可能だが、これはそれぞれ、入力動画基準で何秒か、出力動画基準で何秒かという指定になる。この区別は、例えば途中で再生速度を変更したりタイムスタンプを書き換えたりした際に意味を持つ。

動画の開始時刻の指定: -ss (in/out)

単位は秒で、入出力両方に適応可能なことの意味合いは -t と同様。

品質指定: -q:v / -qscale:v (out)

出力の品質を指定できる。小さい方が高品質だが、ファイルサイズは大きくなる。具体的な意味合いはエンコーダーに依存する。なお、H.264 の場合はどうやらエンコーダーがこの指定を無視するようなので、代わりに以下の2つのエンコーダーオプションを用いる必要がある。

品質指定(最小): -qmin (out)

H.264 等のエンコーダーは、フレームごとに異なる q の値を使っている。このオプションは q の値域の最小値を指定する。

品質指定(最大): -qmax (out)

同様に q の値域の最大値を指定する。具体的な使い方はここを参照。

品質オプションのようにエンコーダー依存が大きいものに関しては、コーデックごとに何が有効か色々と試してみる必要がある。

フレームレート指定: -r (in/out)

単位は FPS。入力への指定と出力への指定で、振る舞いが異なる。入力へ指定した場合、動画に元からあるタイムスタンプが破棄され、ここで指定したフレームレートに基づいて新しくタイムスタンプが振り直される。つまり、間接的に動画の長さが変わることになる。出力へ指定した場合は、いわゆるフレームレート変換的な振る舞いになり、動画の長さは変わらない。なおフレーム補間は行われず、時間的に近いフレームが参照される。

動画サイズ指定: -s (in/out)

指定は -s 1920x1080 という要領で行う。これも入力と出力で意味が異なる。RAW データ等サイズが分からないフォーマットの場合、このオプションを用いてサイズ指定を行う。出力へ指定した場合は、そのサイズへの拡大縮小処理が走る。

ピクセルフォーマット指定: -pix_fmt (in/out)

ピクセルフォーマットとは、YUV データの並び方、ビット深度、UV のサブサンプリング方式等を指定するものである。動画サイズと同様、入力は値が不明なフォーマットの場合の指定、出力はその形式への変換となる。よく使われる、8-bit PLANAR のピクセルフォーマット例をいくつか挙げる。PLANAR というのは、YUV チャンネルをそれぞれ1枚の画像として保持する形式である。

ffmpeg での表記 UV サブサンプリング
yuv420p 縦横共に 1/ 2 にサブサンプリング
yuvj420p 縦横共に 1/ 2 にサブサンプリング
yuv422p 縦のみ 1/ 2 にサブサンプリング
yuv444p サブサンプリングしない

yuvj420p とは yuv420p のフルレンジ版であり、jJPEG からきている。レンジ設定は別にあるので、これは本来であればピクセルフォーマットに含めるべきものではない。ffmpeg としても depricated な設定だが、見かけることがあるので挙げた。フォーマットの一覧は、

ffmpeg -pix_fmts

で取得できる。

アルバムアート追加:

ffmpeg -i input.mp3 -i AlbumArt.png -disposition:v:1 attached_pic -map 0 -map 1 -id3v2_version 3 -metadata:s:v 'show=Show title' -metadata 'title=Music Title' -metadata "artist=Yoiko Tanaka" -metadata genre=misic -metadata date=2022 output.mp3

ビットレート指定: -b:v (out)

単位は bps。M や K などの接頭辞も使用可能。-qmin, -qmax と同様これもエンコーダーへのオプション指定であるが、あまり違いについて考える必要はない。なお、品質と同時に指定した場合にどちらが優先されるのかは把握していない。

音声無効化: -an (in/out)

最後に動画用のオプションではないが、便利なので挙げておく。これを指定すれば音声が削除される。

コマンド例

フォーマットだけ変換する

例えば AVI を MP4 に変換したいが、動画も音声もコーデックはそのままでいいという場合がある。そのときは、

ffmpeg -i input.avi -c copy output.mp4

とすれば、再エンコードなしで入れ物(フォーマット)だけ変更することができる。逆に言えば、-c copy を指定しない場合、仮に同じコーデックであったとしても再エンコードが走るので、品質が落ちる結果になる。

動画のコーデックを H.264 に変換する

人に動画を渡す際は、コーデックを H.264 にしておくのが現状では無難。

ffmpeg -i input.mp4 -c:v libx264 output.mp4

ただ、どこまで確実なのかは把握していないが、コーデック指定を省いて

ffmpeg -i input.mp4 output.mp4

としても望む結果は得られると思う。

RAW データをエンコードする

RAW データの場合は、最低限画像サイズとピクセルフォーマットを指定する必要がある。

ffmpeg -f rawvideo -s 1920x1080 -pix_fmt yuv420p -r 30 -i input.yuv output.mp4

input.yuv は、エンコードしたい全てのフレームデータを1つのファイル内で並べたものである。この例のように yuv 拡張子を使えば、-f rawvideo は省略できる。

H.264 動画の品質コントロール

オプションのところでも述べたが、H.264 の品質コントロールには -qmin, -qmax を用いる必要がある。例えば、

ffmpeg -i input.mp4 -qmax 16 -c:v libx264 output.mp4

として q の最大値を 16 あたりで抑えると、かなり高品質な動画になる。望む品質を得るには、数字を変更しつつ必要に応じて -qmin も指定すればよい。

4K 10-bit の動画を 2K 8-bit YUV420 に変換する

4K 動画や 10-bit 動画は扱いにくいので、2K 8-bit の YUV420 動画に変換したいときがある。

ffmpeg -i input.mp4 -s 1920x1080 -pix_fmt yuv420p output.mp4

YUV444 動画を用意する

あまり見かけないフォーマット(例えば YUV444)の動画が必要な時があるが、変換すれば簡単に手に入る。

ffmpeg -i input.mp4 -pix_fmt yuv444p output.mp4

動画を連番 JPEG に変換する

printf の要領で JPEG ファイル名のパターンを出力に指定すれば、連番 JPEG への変換が行われる。

ffmpeg -r 1 -i input.mp4 'out/img%05d.jpg'

ファイルパスは特殊文字や空白を含むことがあるので、念の為に ' で囲っている。一般的に動画のフレームレートは一定ではないが、ffmpeg の連番 JPEG 出力機能は定フレームレートで JPEG を作ってしまう。そのままだと、タイムスタンプがズレて飛ばされるフレームや重複するフレームが出てしまうので、入力側に -r 1 を設定して防止している。強制的に入力を定フレームレートにしたいだけなので、-r 11 の部分は何でもよい。

なお、別のやり方としては以下でもよい。

ffmpeg -i input.mp4 -vsync passthrough 'out/img%05d.jpg'

これは、出力側と入力側で同じタイムスタンプを使うことを強制している。つまり、「勝手に定フレームレートにせずに、入力通りのタイミングで JPEG にせよ」という指示である。

連番 JPEG を動画に変換する

これは先ほどの逆操作で、簡単である。

ffmpeg -r 30 -i 'in/img%05d.jpg' output.mp4

フレームレートを指定しないと 25 FPS になる。つまり、30 FPS 動画を作ろうとして

ffmpeg -i 'in/img%05d.jpg' -r 30 output.mp4

としてしまうと、25 FPS の動画を 30 FPS に変換したものができてしまうので注意。

簡易スローモーション動画の作成

例えば入力動画が 30 FPS だとすると、

ffmpeg -r 7.5 -i input.mp4 output.mp4

とするだけで、4倍のスローモーション動画を作ることができる。

簡易タイムラプス動画の作成

基本的にはスローモーションの逆である。30 FPS 動画を4倍速にするには、以下のようにすればよい。

ffmpeg -r 120 -i input.mp4 -r 30 output.mp4

120 FPS 動画を表示させるのは現実的ではないので、出力側に常識的なフレームレートを指定して間引きを行っている。

複数の動画ファイルを結合する

複数の動画ファイルを結合するには、まず結合する順番にファイルパスを並べたテキストファイルを用意する。

# 動画のパスをつなげる順に列挙する
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

このように、file の後にパスを記述する。なお、# はコメントであり、念のためにパスを ' で囲っている。フォーマットを concat とし、このテキストファイルを入力として設定すれば、結合された結果が得られる。

ffmpeg -f concat -safe 0 -i input.txt output.mp4

オプション -safe 0 は必須ではないが、これがないと書き方によっては「安全ではないパス」として弾かれてしまい面倒なので、付けている。入力動画のコーデックが同一なら、

ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4

のように書いて再エンコードを避けることもできる。

一定間隔おきに動画の内容を静止画にして保存する

長い動画の内容をひと目で把握するために、例えば10秒おきにフレームを取り出したい場合がある。出力のフレームレート指定を利用して連番 JPEG に変換すれば、簡単に実現できる。

ffmpeg -i input.mp4 -r 1/10 'out/img%05d.jpg'

動画から音声だけを削除する

動画データには手を加えずに、音声データだけファイルから削除する。

ffmpeg -i input.mp4 -c:v copy -an output.mp4

mp4tags options

mp4tags: You must specify at least one MP4 file.
usage mp4tags OPTION... FILE...
Adds or modifies iTunes-compatible tags on MP4 files.

      -help            Display this help text and exit
      -version         Display version information and exit
  -A, -album       STR  Set the album title
  -a, -artist      STR  Set the artist information
  -b, -tempo       NUM  Set the tempo (beats per minute)
  -c, -comment     STR  Set a general comment
  -C, -copyright   STR  Set the copyright information
  -d, -disk        NUM  Set the disk number
  -D, -disks       NUM  Set the number of disks
  -e, -encodedby   STR  Set the name of the person or company who encoded the file
  -E, -tool        STR  Set the software used for encoding
  -g, -genre       STR  Set the genre name
  -G, -grouping    STR  Set the grouping name
  -H, -hdvideo     NUM  Set the HD flag (1\0)
  -i, -type        STR  Set the Media Type(tvshow, movie, music, ...)
  -I, -contentid   NUM  Set the content ID
  -j, -genreid     NUM  Set the genre ID
  -l, -longdesc    STR  Set the long description
  -L, -lyrics      NUM  Set the lyrics
  -m, -description STR  Set the short description
  -M, -episode     NUM  Set the episode number
  -n, -season      NUM  Set the season number
  -N, -network     STR  Set the TV network
  -o, -episodeid   STR  Set the TV episode ID
  -O, -category    STR  Set the category
  -p, -playlistid  NUM  Set the playlist ID
  -P, -picture     PTH  Set the picture as a .png
  -B, -podcast     NUM  Set the podcast flag.
  -R, -albumartist STR  Set the album artist
  -s, -song        STR  Set the song title
  -S  -show        STR  Set the TV show
  -t, -track       NUM  Set the track number
  -T, -tracks      NUM  Set the number of tracks
  -x, -xid         STR  Set the globally-unique xid (vendor:scheme:id)
  -X, -rating      STR  Set the Rating(none, clean, explicit)
  -w, -writer      STR  Set the composer information
  -y, -year        NUM  Set the release date
  -z, -artistid    NUM  Set the artist ID
  -Z, -composerid  NUM  Set the composer ID
  -r, -remove      STR  Remove tags by code (e.g. "-r cs"
                        removes the comment and song tags)