ffmpeg: secara eksplisit menandai h.264 sebagai bt.601, daripada meninggalkan yang tidak ditentukan?

12

Saya ingin menandai video sebagai bt.601 secara eksplisit, daripada "tidak ditentukan". Saya tahu para pemain biasanya memilih bt.601 sebagai default untuk video dengan lebar kurang dari 1280 piksel, tetapi saya ingin membuatnya secara eksplisit bahwa bt.601 adalah matriks warna yang benar untuk sebuah video.

Poin yang menonjol adalah tidak ada bt601opsi untuk ffmpeg atau libx264, hanya bt709 dan beberapa lainnya.

Saya memiliki beberapa video yang diturunkan dari HD, dan masih dalam bt.709, tetapi tidak ditandai dengan benar. Jadi ketika saya menonton video, kadang-kadang saya harus secara manual beralih pemain saya ke bt.709 . Memberi tag secara eksplisit sebagai bt.601 akan berkomunikasi dengan pemirsa di masa mendatang (misalnya saya) bahwa itu pasti bt.601, dan bukan video bt.709 yang salah ditandai, ketika saya melihatnya dengan mediainfo.

Kasus penggunaan lain untuk ini adalah jika Anda meningkatkan video bt.601 menjadi 1280 atau lebih tinggi tanpa melakukan konversi colormatrix (menggunakan -vf colormatrix), pemain akan salah mengasumsikan bt.709 jika Anda meninggalkan informasi warna yang tidak ditentukan.

colormatrixFilter video FFMpeg memang mendukung bt601sebagai matriks warna input atau output, tetapi tidak juga menetapkan tag. (Karena tidak memiliki efek samping pengaturan opsi warna ffmpeg, ia menolak untuk beroperasi dengan src dan dest sama, seperti -vf colormatrix=bt601:bt601.)


ffmpg in  -color_primaries bt709 -color_trc bt709 -colorspace bt709  out

akan memberi tag pada output video menggunakan bt.709 untuk yuv <-> rgb. Tag berakhir di dalam bitstream video itu sendiri, bukan hanya di wadah (karena ini tampaknya merupakan hal yang spesifik-codec, bukan hal wadah, untuk wadah mp4 dan mkv setidaknya).

misalnya mediainfokeluaran:

Complete name             : out.mkv
...
Writing application                      : Lavf57.14.100
Writing library                          : Lavf57.14.100


Video
ID                                       : 1
Format                                   : AVC
...
Writing library                          : x264 core 148 r2638+4 afcf21c
Encoding settings                        : cabac=1 / ref=8 / ...
Language                                 : English
Default                                  : Yes
Forced                                   : No
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709

Jadi, bt.709 mudah ditandai. Masalahnya adalah, saya tidak melihat bt.601 di mana pun. Apakah salah satu nama lain alias untuk itu, atau apakah benar-benar tidak ada cara untuk menentukannya secara eksplisit?

x264 --fullhelp output:

  --colorprim <string>    Specify color primaries ["undef"]
                              - undef, bt709, bt470m, bt470bg, smpte170m,
                                smpte240m, film, bt2020
  --transfer <string>     Specify transfer characteristics ["undef"]
                              - undef, bt709, bt470m, bt470bg, smpte170m,
                                smpte240m, linear, log100, log316,
                                iec61966-2-4, bt1361e, iec61966-2-1,
                                bt2020-10, bt2020-12
  --colormatrix <string>  Specify color matrix setting ["???"]
                              - undef, bt709, fcc, bt470bg, smpte170m,
                                smpte240m, GBR, YCgCo, bt2020nc, bt2020c

ffmpeg -h full memperlihatkan serangkaian opsi yang sama untuk opsi warnanya, yang mana -c:v libx264codec video ffmpeg beralih ke x264. Apakah ini alias alias untuk bt.601, atau memiliki matriks warna yang setara secara numerik?

Peter Cordes
sumber
Saya memiliki masalah yang sama persis. Apakah Anda mengetahui baris perintah yang digunakan untuk mendapatkan h264 rekaman HD yang ditandai dengan BT.601?
Casper
@Casper: ya, saya menerima jawaban Mulvya karena banyak info untuk mencari opsi yang tepat. Saya melakukan edit untuk memasukkan opsi yang tepat secara eksplisit (mis. NTSC -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
Peter Cordes

Jawaban:

12

PAL dan NTSC memiliki warna primer yang berbeda, jadi

NTSC = SMPTE 170M = BT 601 525

PAL = BT 470 BG = BT 601 625

Lihat baris untuk nilai 5 & 6 pada tabel di halaman 387 dari standar H.264 aktif .


Jadi argumen yang tepat untuk ffmpeg adalah:

NTSC:

# NTSC
ffmpeg -i input  \
 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m

mediainfo:
Color primaries                          : BT.601 NTSC
Transfer characteristics                 : BT.601
Matrix coefficients                      : BT.601

SAHABAT:

-color_trctidak menerima bt470bg, tetapi ffmpeg -h fullmenunjukkan bahwa itu gamma28berarti "BT.470 BG" untuk opsi itu.

# PAL
ffmpeg -i input  \
 -colorspace bt470bg -color_primaries bt470bg -color_trc gamma28

mediainfo:
Color primaries                          : BT.601 PAL
Transfer characteristics                 : BT.470 System B, BT.470 System G
Matrix coefficients                      : BT.601

-colorspaceadalah opsi yang paling penting; yang lain tidak membuat perbedaan yang terlihat bagi pemain perangkat lunak seperti mpvdi Linux.

Gyan
sumber
Ah tentu saja. Saya bahkan melihat halaman wikipedia bt601, dan tidak tahu dari tabel memiliki dua baris. Derp.
Peter Cordes
Bagi mereka yang ingin melakukan pengaturan yang sama dengan HandBrake, di bawah tab Video, di dalam kotak edit Opsi Tambahan, masukkan string ini: "colorprim = smpte170m: transfer = smpte170m: colormatrix = smpte170m"
pcunite