PCTUNER.RU
Максимальные скидки на шкафы купе на заказ. Дешевле нет!
Санкт-Петербург. Интересует звукоизоляция квартиры сейчас? Спешите

Соединять в один несколько AVI файлов, не такое простое дело, как может показаться по началу. Дело в том, что чаще всего отдельные фрагменты, имеют разный FPS, и именно по этой причине VirtualDub отказывается их соединять.

Разный FPS, другими словами разное количество кадров в секунду, могло получиться из-за того, что при захвате видео вы делали привязку видео потока к звуку, во избежание рассинхронизации видео и звука. Что же теперь делать, спросите вы...

Самый простой и верный способ избежать таких проблем - это захватывать видео не кусками, а все сразу. Тем более, что вы уже знаете, как создавать большие по продолжительности и по объему AVI файлы (статья "Захват видео"), и знаете, что особых проблем при этом нет.

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

Теперь я вас предупредил, что лучше так не делать и рассказал о том, как можно этого избежать. :) Поэтому переходим, непосредственно, к способу соединения...



1. Идеальный вариант - AVI файлы имеют одинаковый FPS.

Открываем в VirtualDub первый фрагмент, с которого в дальнейшем начнется будущий ролик.

Присоединяем, к уже открытому фрагменту, следующий, для этого выбираем команду:

Выбираем файл. Открытый, таким образом, файл будет присоединен в конец предыдущего.

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

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

Сохранить тоже можно по разному, можно с пережатием и без пережатия видео и аудио потоков.

В общем, не буду повторяться - вы все это знаете из предыдущих описаний...



2. Не идеальный вариант - AVI файлы имеют различный FPS.

Мы имеем некоторое количество видео фрагментов, которые в свою очередь имеют различный FPS. Сразу склеить их, при помощи VirtualDub, нам не удастся. Поэтому для начала все имеющиеся фрагменты необходимо привести к одному FPS, и это совсем не простая задача!

Меняя частоту кадров AVI, мы ускоряем или замедляем поток кадров, следовательно, меняем продолжительность AVI. Но при этом звуковая дорожка остается неизменной, VirtualDub не сопоставляет ее видео потоку! Поэтому, неизбежно получается рассинхронизация видео и аудио потоков.

Выясним FPS фрагментов, которые нужно соединить. Для этого, поочередно, каждый файл открываем в VirtualDub, в меню "Video" выбираем :

В открывшемся окне видим FPS текущего файла:

Запоминем или лучше записываем значение FPS. Открываем следующий AVI файли таким же образом выясняем его FPS, и т.д.

  • Если вы видите, что FPS всех файлов меняется незначительно - рассчитайте или приблизительно оцените их среднее значение. Потом частоту кадров будете приводить к этому среднему значению. Это важно, т.к. при этом FPS для большинства фрагментов будет меняться незначительно и, следовательно, меньше будет рассинхронизация.


  • Если из всех имеющихся фрагментов всего один или несколько имеют значительно отличающееся значение FPS - обрабатывайте их по отдельности. Т.е. этот один или несколько фрагментов пока не трогайте, возьмите те, что похожи, рассчитайте и приведите их к среднему FPS. Оставшиеся приведите к этому же среднему FPS другим способом, об этом дальше.


  • Если у всех файлов разбег FPS значительный их так же следует приводить к среднему значению, но по-другому.


2.1. Приведение AVI файлов к одному FPS (разбег не значительный).

Обычно, если видео фрагменты захватывались с одного и того же источника, то FPS у них изменяется весьма не значительно. Кроме того, чем фрагменты меньше по продолжительности, тем разбег, еще меньше.

И так мы знаем средний FPS, к которому будем приводить все имеющиеся фрагменты. Открываем в VirtualDub первый AVI файл:

Передвинете ползунок в конец фрагмента или нажмите соответствующую кнопку на панели и посмотрите его продолжительность :

У меня фрагмент имеет продолжительность 0 часов, 08 минут, 40.369 секунд.

Переходим к уже знакомому диалоговому окну:

Выбираем пункт "Change to...". Вписываем среднее известное значение, остальное по умолчанию, нажимаем ОК.

Посмотрите снова на продолжительность вашего фрагмента, теперь она другая:

В силу того, что у меня фрагмент всего 8 минут продолжительностью и FPS изменялся очень не значительно - изменение в его продолжительности составило лишь доли секунды. Это значит, что в конце фрагмента рассинхронизация видео и звука составляет как раз эти доли секунды. Что, в общем-то, совсем не много и даже если очень стараться врятли можно их будет заметить при просмотре. Поэтому я не вижу смысла корректировать синхронизацию, в данном случае, пусть остается, как есть.

Сохраняем изменения FPS. Для этого, предварительно убедитесь, что для видео и аудио потоков, в соответствующих меню, выбран пункт "Direct stream copy". Т.е. потоки будут копироваться без обработки.

Сохраняем.

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

После обработки всех фрагментов, вы можете переходить, непосредственно к соединению AVIшек. Делается это, теперь, в точности так же, как и при идеальном варианте, пункт 1.

Тем же кому, повезло меньше, и рассинхронизация получилась заметной, посвящается дальнейшее описание...


Рассинхронизацию в пределах 0.5 секунд, к концу фрагмента, можно в какой-то степени исправить имеющимися у VirtualDub средствами. Для этого нужно зайти :

Здесь выберете "Preload" и "Interleave.." = 1000ms ... 1500ms. Изменяя значение "Delay audio track by" вы можете немного сдвинуть звук, относительно видео потока. Положительное значение используйте, если звук опережает видео. Отрицательные значения используйте, если наоборот звук отстает от видео.

Вообще, конечно, в нашем случае рассинхронизация имеет нарастающий характер, поэтому ее нельзя исправить простым сдвижением аудио потока, относительно видео потока. Но ее можно в некоторой степени компенсировать или сделать менее заметной.

К примеру, изначально вы имеете, в начале полную синхронизацию, а к концу уход одного потока относительно другого составляет 0.5 секунд. Сделайте так, что бы уже в начале была рассинхронизация 0.25 секунд, таким образом, где-то по середине будет синхронность, а в конце снова уход на 0.25 секунд.

Только не подумайте, что 0.5 секунд - это какое-то ограничение, просто я считаю, что большую рассиннхронизацию, таким сдвижением потока не исправить и не компенсировать, она все равно останется заметной.

Для сохранения изменений в AVI, после изменения параметра "Delay audio track by", так же достаточно выбрать для видео и аудио потоков "Direct stream copy", после чего сохранить.

Тех же, кого не устраивает устранение рассинхронизации за счет сдвижения потока, а так же кому вообще не повезло и имеющаяся рассинхронизация значительна - читайте следующий пункт.



2.2. Приведение AVI файлов к одному FPS (разбег большой).

VirtualDub хорошая программа - это в не сомнения. Однако нет в ней опций, которые могли бы устранить значительную рассинхронизацию видео и звука при большом изменении частоты кадров. Поэтому способ описываемый далее, предполагает обработку звука отдельно от видео...

Открываем в VirtualDub первый AVI файл:

Сохраняем звук открытого AVI в отдельный WAV файл :

Для видео выбираем "Direct stream copy", для звука "No audio" :

Переходим к знакомому диалоговому окну:

Выбираем пункт "Change to...". Вписываем среднее известное значение, остальное по умолчанию, нажимаем ОК.

Перейдите на конец фрагмента, что бы посмотреть его продолжительность, после изменения FPS.

Запишите значение времени. Сохраните AVI.

Таким образом, мы имеет отдельно звук в WAV файле, и имеем AVI файл, с измененным FPS без звука.

Теперь нам понадобиться звуковой редактор, например SonicFoundry Sound Forge или Syntrillium Cool Edit (конечно же, есть и другие). У меня под руками оказалась программа Cool Edit, поэтому я буду рассказывать, и показывать на ее примере.

Запускаем Cool Edit, открываем WAV файл.

Для сжатия/растяжения звука по времени, выбираем в меню:

В диалоговом окне, в поле "Length" необходимо ввести новую длину WAV файла, т.е. то значение, которое мы переписали поле смены FPS в VirtualDub. Значение необходимо вводить в секундах (например, у меня значение 0:07:13.595, в секундах это 7*60+13.595=433.595). Вводим, нажимаем OK :

По окончанию обработки убедитесь, что продолжительность соответствует необходимой. У меня она отличается на 1 тысячную долю секунды, думаю это в пределах допустимого. :)

Сохраняем.

Запускаем VirtualDub, открываем наш AVI файл без звука. Через меню "Audio" подключаем новый звук:

Для сохранения AVI с новым звуком, для видео и аудио потоков выбираем "Direct stream copy" :

Сохраняем.

Так обрабатываем все AVI файлы. Ну а после того как все будет готово, файлы можно соединять так, как это делается при идеальном варианте, пункт 1.



Ну вот вроде и все! :-)



3. Советы и замечания :

  • Приводить частоту кадров имеет смысл только в случае, если исходник не сжат, или сжат MJPEG-ом, Huffyuv-ом. Т.е. кодеком, при сжатии которым, каждый кадр является ключевым. В противном случае, все равно, обрабатываться будут только полные кадры (ключевые) и ничего хорошего не выйдет...


  • Если не исключена возможность пропуска кадров в обрабатываемых фрагментах, то первое, что нужно сделать после открытия исходного авишника ВиртуалДубом (ВД) - проверить его на dropped frames. Жмете shift + "}" для поиска вперёд либо shift + "{" для поиска назад. Удаляете клавишей Delete. Если это не сделать - звук неизбежно разбежится с видеопотоком. Эти манипуляции нужно делать несколько раз, пока ВД не сообщит "no next (previous) dropped frame" (в нижнем левом углу). Эти фреймы ВД просто игнорирует - так что лучше удалить больное место сразу. Только после этого следует переходить к обработке AVI : изменению FPS, сохранению отдельно видео/звука и т.д.


  • Copyright © Олег Антошкив
    Хочу дать совет как избежать процесса перезаписи AVI с целью изменить у него Frame Rate. Для этого достаточно использовать программу : Avifrate1.10 - framerate changer for Avis. Она изменяет Frame Rate в заголовке AVI без перезаписывания всего файла, а это существенно экономит время и не нужно свободного места на диске для промежуточного файла. Я неоднократно использовал эту программу для приведения частоты кадров к одному значению у нескольких AVI и последующей склейки в VirtualDub.

    Со звуком я немного по другому работал: из каждого фрагмента сохранял звук в отдельные файлы, корректировал их длительность, потом склеивал все звуковые фрагменты в один кусок и уже его подключал в VirtualDub в качестве источника звука для "виртуально" соединенных фрагментов видео.
Друзьям тоже нравятся интересные статьи 10225037
Версия для печати

1 комментарий


16 декабря 2011, 07:01 irina_mark
Помогло, спасибо. Урок пройден, проблема исправлена.
Ответить

Новый комментарий
Страница создана за 0.175 секунды
Copyright © 1999-2014 PCTUNER.RU · Design by Alex Dovby · Hosting by Nqhost