Korzystam z tych poleceń, aby wygenerować wyjście TIFF i JPEG na podstawie tego samego wejściowego pliku MPEG2
ffmpeg -ss 14 -i '../test/test-in.mpg' -q: v 3 -vframes 1 -aspect 4: 3 -vf "crop = 22/23 * in_w: 22/23 * in_h, yadif, scale = 736: 539, pad = 736: 552: 0: 7 "'../test/test-out.jpg'
i
ffmpeg -ss 14 -i '../test/test-in.mpg' -vframes 1 -aspect 445: 326 -vf "crop = 22/23 * in_w: 22/23 * in_h, yadif, skala = 720: 527 „” ../unit-test/out.tiff ”
tiffy są bardzo fioletowe / różowawe. JPEG są w porządku.
P: Co może powodować przesunięcie koloru na wyjściu TIFF i jak mogę temu zapobiec?
Dane wyjściowe wiersza polecenia
ffmpeg -ss 15 -i '../test/test.mpg' -vframes 1 -aspect 4:3 -vf "crop=21/23*in_w:21/23*in_h ,yadif,scale=720:540" -vstats_file /home/factory/log/20140630143715-mpg2stills.log '../test/test.tiff'
ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
built on Oct 26 2013 23:16:12 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
[mpeg @ 0xa4a1440] max_analyze_duration 5000000 reached at 5016000 microseconds
Input #0, mpeg, from '../test/test.mpg':
Duration: 00:00:30.62, start: 0.384000, bitrate: 7746 kb/s
Stream #0:0[0x1c0]: Audio: mp2, 48000 Hz, stereo, s16p, 384 kb/s
Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
Output #0, image2, to '../test/test.tiff':
Metadata:
encoder : Lavf54.63.104
Stream #0:0: Video: tiff, yuv420p, 720x540 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
Stream #0:1 -> #0:0 (mpeg2video -> tiff)
Press [q] to stop, [?] for help
[mpeg2video @ 0xa4a3060] warning: first frame is no keyframe
frame= 1 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A
video:563kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.003817%
przycięta wersja wejścia mpg (przyciągnięta przez VLC)
przycięta wersja wyjściowego tiffa (przekonwertowana do png do przesłania)
Odpowiedzi:
Problem polegał na przestrzeni kolorów obrazu tiff. ffmpeg kopiuje przestrzeń kolorów z pliku MPEG, który został zakodowany w YUV. Dane exif pliku tiff wykazały, że był to „YCbCr”, czyli YUV.
Wynikowy plik tiff może być przeglądany przez niektóre aplikacje, ale inne aplikacje (zwłaszcza Photoshop) zgłosiły, że są uszkodzone. Nie jestem pewien, czy to błąd w ffmpeg. Przekazałem wynik przez imagemagick bez jakiejkolwiek transformacji, co zdawało się naprawiać plik.
Jednak imagemagick zakładał, że jest to RGB, i ustawił dane exif na RGB bez faktycznej zmiany danych obrazu. To właśnie dzieje się zmiana odcienia. Ponownie nie jestem pewien, czy to błąd w imagemagick.
JPEG nie miał żadnych problemów.
Jednym z prawidłowych rozwiązań jest określenie w poleceniu ffmpeg pix_fmt, który ma być używany. Zobacz https://ffmpeg.org/ffmpeg.html#Advanced-Video-options
Więc to zrobiło:
źródło