ffmpeg: Как создать MOV с прозрачным фоном?

Я пытаюсь - безуспешно - преобразовать зеленые пиксели фона в прозрачные и вывести результат в виде клипа с помощью ffmpeg. Н.Б. Я не хочу накладывать клип поверх чего-либо; У меня нет проблем с этим. Я хочу клип с прозрачным фоном для видеоредактора OpenShot (фильтр хромакея которого работает неудовлетворительно).

То, что я пробовал (среди миллиона других вещей за последние 15 часов), было

ffmpeg.exe -i in.mov -vf chromakey=0x008001:0.115:0.0 -c:v qtrle out.mov

но пиксели просто не были бы прозрачными. Вроде ничего не происходит. Я считаю, что фильтр в порядке, потому что он отлично работает в сложной цепочке (наложение фонового изображения).

Вывод ffprompt -show_stream -show_format из out.mov выглядит следующим образом:

[STREAM]
index=0
codec_name=qtrle
codec_long_name=QuickTime Animation (RLE) video
profile=unknown
codec_type=video
codec_time_base=1/30
codec_tag_string=rle
codec_tag=0x20656c72
width=1920
height=1080
coded_width=1920
coded_height=1080
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=bgra
level=-99
color_range=N/A
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=unspecified
field_order=progressive
timecode=N/A
refs=1
id=N/A
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/15360
start_pts=0
start_time=0.000000
duration_ts=54789
duration=3.566992
bit_rate=822383192
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=107
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=eng
TAG:handler_name=DataHandler
TAG:encoder=Lavc57.64.101 qtrle
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/44100
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=44100
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/44100
start_pts=926
start_time=0.020998
duration_ts=157481
duration=3.570998
bit_rate=132103
max_bit_rate=132103
bits_per_raw_sample=N/A
nb_frames=153
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=eng
TAG:handler_name=DataHandler
[/STREAM]
[FORMAT]
filename=out.mov
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=3.567000
size=366708874
bit_rate=822447712
probe_score=100
TAG:major_brand=qt
TAG:minor_version=512
TAG:compatible_brands=qt
TAG:encoder=Lavf57.56.101
[/FORMAT]

У меня есть «образец» клипа, который показывает поведение, которое я хочу, со следующим потоком и информацией:

[STREAM]
index=0
codec_name=qtrle
codec_long_name=QuickTime Animation (RLE) video
profile=unknown
codec_type=video
codec_time_base=1/24
codec_tag_string=rle
codec_tag=0x20656c72
width=1920
height=1080
coded_width=1920
coded_height=1080
has_b_frames=0
sample_aspect_ratio=0:1
display_aspect_ratio=0:1
pix_fmt=bgra
level=-99
color_range=N/A
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=unspecified
field_order=progressive
timecode=N/A
refs=1
id=N/A
r_frame_rate=24/1
avg_frame_rate=24/1
time_base=1/12288
start_pts=0
start_time=0.000000
duration_ts=74760
duration=6.083984
bit_rate=49226848
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=146
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=eng
TAG:handler_name=DataHandler
TAG:encoder=Lavc57.24.102 qtrle
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/48000
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=0
start_time=0.000000
duration_ts=293856
duration=6.122000
bit_rate=53537
max_bit_rate=128000
bits_per_raw_sample=N/A
nb_frames=288
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=eng
TAG:handler_name=DataHandler
[/STREAM]
[FORMAT]
filename=templateOK.mov
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=6.144000
size=37478506
bit_rate=48800138
probe_score=100
TAG:major_brand=qt
TAG:minor_version=512
TAG:compatible_brands=qt
TAG:encoder=Lavf57.25.100
[/FORMAT]

и я просто не могу определить соответствующую разницу.

Ввод, вывод и рабочий шаблон можно найти здесь.

(Проблема безопасности, которую вы можете увидеть при переходе по ссылке, возникает из-за того, что сертификат сервера является самоподписанным. Вы можете принять временное исключение. Кстати: смехотворный размер выходного файла будет следующим орешком, который нужно взломать. Вероятно, что-то о сжатии .)


person Mat    schedule 25.03.2017    source источник
comment
Попробуйте с -c:v png   -  person Gyan    schedule 25.03.2017
comment
Спасибо, Мульвия! У меня есть. Как я уже сказал, у меня было всего 15 часов. методом проб и ошибок. В основном ошибка. :-(((   -  person Mat    schedule 25.03.2017
comment
Вы пытались наложить закодированное видео в ffmpeg? Как ты проверяешь прозрачность?   -  person Gyan    schedule 25.03.2017
comment
Да, я уже сделал это. Вот почему я уверен, что сама настройка фильтра ('chromakey=0x008001:0.115:0.0') работает нормально.   -  person Mat    schedule 25.03.2017
comment
Если вы проверили закодированный файл, то MOV тоже в порядке. Это проблема с вашим редактором. Вы можете попробовать другой формат пикселей -pix_fmt rgba.   -  person Gyan    schedule 25.03.2017
comment
Я бы согласился, но все форматы, кроме argb, выдают предупреждение ffmpeg Несовместимый формат пикселей «rgba» для кодека «qtrle», автоматический выбор формата «argb». Какие другие кодеки могут обрабатывать прозрачность? К сожалению, я, похоже, не могу узнать об этом из документации ffmpeg. (Я пытался, честно.)   -  person Mat    schedule 25.03.2017
comment
Ваш out.mov имеет прозрачность в Vegas Pro. Как ты проверяешь прозрачность?   -  person Gyan    schedule 25.03.2017
comment
О ф...! Я все время лаял не на то дерево! Я проверял прозрачность, проигрывая видео в vlc, где ожидал увидеть черный фон — чего просто не было: зеленая ткань выглядит примерно так же, как в in.mov. Так что это просто vlc игнорирует альфа-канал, не так ли? После вашей подсказки вставляю клип в редактор (OpenShot) - и вуаля! Большое спасибо большое! Такая идея никогда бы не пришла мне в голову! Я очень ценю вашу помощь, и особенно спасибо за беспокойство! (Как вы уже могли догадаться, я полный новичок в редактировании видео.) Ура!   -  person Mat    schedule 25.03.2017
comment
(Кроме того, мы не используем здесь [решенные] устройства и не добавляем ответы в сообщения с вопросами. Если вы хотите добавить ответ сверх того, что уже есть ниже, мы также приветствуем самостоятельные ответы).   -  person halfer    schedule 26.03.2017


Ответы (1)


Как вы заметили, видеоплеер не будет показывать прозрачность.

Прозрачности в видео на самом деле не существует. Каждый пиксель должен иметь некоторый цвет. Прозрачность реализуется путем добавления еще одного компонента, называемого альфа. Значение альфа-канала в позиции определяет, как приложение, обрабатывающее файл, смешивает цветной пиксель в этой позиции с цветными пикселями слоя (слоев) под ним (сами взвешенные по их альфа-каналу). Если ниже нет слоев, как в случае с видеоплеером, смешивание не происходит и отображается сохраненный цвет. Если альфа для пикселя равна 0, тогда цвет обнуляется, и слой под ним полностью просвечивает, и, следовательно, «прозрачность».

Короче говоря: проверьте прозрачность в приложении, которое может компоновать, например, в видеоредакторе или приложении VFX.

person Gyan    schedule 25.03.2017