Как правильно делать push-source фильтры? я уже нервничаю..
От:
Аноним
Дата:
19.05.09 15:41
Оценка:
Я весь в растерянности и нуждаюсь в помощи: я чем дальше, тем меньше соображаю, как работает директшоу
У меня следующая задача: я (грубо говоря) получаю набор картинок, из которых надо сделать видео, и записываю звук, который потом надо подклеить в видео; видео — .avi
Для видео я сделал фильтр (push, правильно?.. тупо по образцу из здк), который берет картинку, делает из нее RGB32 и разные другие телодвижения и отдает ее в семпле (тип семпла я благополучно правильно настроил), в FillBuffer надо установить время семппла: старт = номер кадра * длительность кадра, стоп = старт + длительность кадра
Все как будто бы правильно?
Для звука я согласовываю тип, который нужен компрессору звука, после чего в FillBuffer если надо ресемплю звук и отдаю его семплом следующему фильтру; тут я не знаю как делать правильно, отдаю по 1/4 секунды да и все (там не точно 1/4, если декодируется мр3 например, то там будет слегка больше ведь, если я ориентируюсь по кол-ву декодированных звуковых семплов), для установки времени медиа-семпла я вычисляю продолжительность (samplerate то я знаю) пакета
ЧТо тут может быть неправильно?.. у меня сложности разные:
1) как вставить звук в видео не с самого начала файла, а скажем со сдвигом в 40 сек? как будто бы логично отмечать семплы звука "правильным" временем, а муксер разберется — но нет, звук всегда идет с начала файла (по крайней мере тестил с PCM компрессором.. может это компрессор меняет метки времени как-то дальше — потому что в старых проектах видео с мр3 звуком вроде работало правильно со сдвигом..или в Win7 дело?..)
2) вставляю компрессор PCM — файл создается и все вроде нормально; вставляю компрессор ADPCM (суть в том, чтобы можно было использовать любой из компрессоров, установленных в системе) — после того как звук заканчивается (фильтр-источник звука возвращает s_false) через несколько кадров, выданных источником видео возникает ошибка (80040228 кажется) — "время окончания семпла меньше времени начала" — но такого быть не может: фильтр со звуком больше не работает, фильтр с видео не может выдать время окончания больше времени начала просто потому, что время окончания = время начала + продолжительность (а она не может стать < 0)
Другие компрессоры звука дурят еще как-то, то файл получается в 2 раза длиннее чем должен бы быть, а при проигрывании все "замерзает" или плеер падает..
Шо характерно, с видео вроде проблем нету, а звук дурит.. где-то я неправ, а где — натыкайте носом что-ли..
Стандартный AVI Mux довольно капризен по отношению к звуку. Придется или его ублажать, или поискать ему замену. Я в итоге от него отказался и пользуюсь собственным фильтром для записи AVI.
Насколько я помню, в заголовках AVI можно указать, что звук сдвинут относительно видео, но AVI Mux так не умеет. Длительность видео и звука для него тоже должны совпадать.
Re[2]: Как правильно делать push-source фильтры? я уже нервн
От:
Аноним
Дата:
20.05.09 06:47
Оценка:
Здравствуйте, D. Mon, Вы писали:
DM>Стандартный AVI Mux довольно капризен по отношению к звуку. Придется или его ублажать, или поискать ему замену. Я в итоге от него отказался и пользуюсь собственным фильтром для записи AVI.
DM>Насколько я помню, в заголовках AVI можно указать, что звук сдвинут относительно видео, но AVI Mux так не умеет. Длительность видео и звука для него тоже должны совпадать.
Но это же не совсем правильно тогда получается.. писать фильтр и держать "в уме", что его будет использовать какой-то нестандартный муксер..
В идее то я сделал фильтр, а его могут использовать хоть для записи в ави, хоть в mkv, хоть для просмотра..
С другой стороны — тогда можно делать свой муксер, который мог бы муксить и ави, и тот же мкв, и прочий зоопарк форматов.. Стоит ли только?..
Re[3]: Как правильно делать push-source фильтры? я уже нервн
Просто дело не в фильтре, а в том, что и как пишется в AVI. На месте Вашего фильтра мог быть любой другой, и было бы то же самое в тех же звуковых условиях.
Re[4]: Как правильно делать push-source фильтры? я уже нервн
От:
Аноним
Дата:
22.05.09 14:42
Оценка:
Здравствуйте, D. Mon, Вы писали:
DM>Просто дело не в фильтре, а в том, что и как пишется в AVI. На месте Вашего фильтра мог быть любой другой, и было бы то же самое в тех же звуковых условиях.
К вечеру пятницы я нервничаю все сильнее и сильнее
Решил пойти простым и прямым способом: фильтр выдает только PCM, только 44.1/стерео, безо всяких отступов
Для отступа я просто в FillBuffer заполняю буфер нулями, пока не заполнится нужная пауза (естественно я это не за раз делаю, а порциями по 1/4 секунды)
Полная хрень получается: с рендерером все нормально, есть пауза; а с кодеком в мр3 (для отладки после него я поставил фильтр-дампер, который мне показывает семплы, выдаваемые мр3-кодеком) — пока ему приходит буфер, заполненый нулями, он вообще не чухается, как только начинают идти данные (промаркированный уже черт-знает каким временем) он вдупляется и начинает кодить, выдавая семплы, которые помечает с нуля и дальше — т.е. мои много-секунд тишины (а ему не все ли равно, тишина там или что) кодеком игнорируются
Если добавить PCM-кодек — все нормально; пробовал еще с WM Speech Encoder (короче я все подряд кодеки пробую) — нормально
С MS ADPCM все кодится, а после того, как мой фильтр-источник говорит, что данные закончились — выдается ошибка 80040228 (время начала после времени окончания семпла, хрень какая-то полная
В данном то случае муксер не должен влиять, чего тогда кодеки эти так себя ведут по идиотски?.. подстраиваться под них чтоли (знать бы еще что подстраивать)..
Не посоветуете может еще какой-нить фильтр-муксер (с avi, mkv), чтобы исключить его влияние?..
в общем, нахрен эту работу, пятница, пора выходные начинать..
Re[5]: Как правильно делать push-source фильтры? я уже нервн
От:
Аноним
Дата:
22.05.09 15:01
Оценка:
А>С MS ADPCM все кодится, а после того, как мой фильтр-источник говорит, что данные закончились — выдается ошибка 80040228 (время начала после времени окончания семпла, хрень какая-то полная
это точно бага из-за avi-муксера, в mkv нормально все записалось..
Re[5]: Как правильно делать push-source фильтры? я уже нервн
От:
Аноним
Дата:
22.05.09 15:12
Оценка:
пошло быдло-кодерство, чесслово (что я целый день седня этим термином озабочен??):
в FillBuffer пишу вместо тишины:
out_ptr := PWord (pdata);
for x := 0 to decoded_total div 2 — 1 do
begin
FillMemory ( out_ptr, decoded_total, x );
inc (out_ptr);
end;
если слушать рендерер — как положено 3 секунды рипения (странный такой звук генерится); в avi файле же, звук которого закодирован в mp3 — рипит очень мало, пол-секунды не наберется
надо дискредитировать этот кодек да и все (он на исходниках ламе явно, закладка абоут осталась, но обзывается Geovid какой-то)
нахрен все, домой %)
Re[6]: Как правильно делать push-source фильтры? я уже нервн
Здравствуйте, Аноним, Вы писали:
А>надо дискредитировать этот кодек да и все (он на исходниках ламе явно, закладка абоут осталась, но обзывается Geovid какой-то)
Не используйте Geovid-овский кодек. НИКОГДА. :D Это и правда lame переделанный, но как-то сильно, и, похоже, криворукими товарищами. Я как-то с ним 3 или 4 дня развлекался, так ничего и не получилось в итоге.
А>нахрен все, домой %)
И правильно
Re[7]: Как правильно делать push-source фильтры? я уже нервн
От:
Аноним
Дата:
23.05.09 20:09
Оценка:
Здравствуйте, alxn1, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>надо дискредитировать этот кодек да и все (он на исходниках ламе явно, закладка абоут осталась, но обзывается Geovid какой-то)
A>Не используйте Geovid-овский кодек. НИКОГДА. :D Это и правда lame переделанный, но как-то сильно, и, похоже, криворукими товарищами. Я как-то с ним 3 или 4 дня развлекался, так ничего и не получилось в итоге.
оно то да.. но "оригинальный" ds-кодек lame если ставить — он (как правило — в 3-х случаях из 3-х) ставится не в Audio compressors, а просто в фильтры
как тогда составлять список кодеков доступных?.. или 1) запомнить, что ламе так себя ведет, 2) сканировать вообще все подряд фильтры и как-то определять, что они звук компрессируют?..
Re[8]: Как правильно делать push-source фильтры? я уже нервн
ставь ACM версию, он припишется в Audio compressors.
А>оно то да.. но "оригинальный" ds-кодек lame если ставить — он (как правило — в 3-х случаях из 3-х) ставится не в Audio compressors, а просто в фильтры
А>как тогда составлять список кодеков доступных?.. или 1) запомнить, что ламе так себя ведет, 2) сканировать вообще все подряд фильтры и как-то определять, что они звук компрессируют?..
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Как правильно делать push-source фильтры? я уже нервн
От:
Аноним
Дата:
25.05.09 09:07
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Решил пойти простым и прямым способом: фильтр выдает только PCM, только 44.1/стерео, безо всяких отступов
А>Для отступа я просто в FillBuffer заполняю буфер нулями, пока не заполнится нужная пауза (естественно я это не за раз делаю, а порциями по 1/4 секунды)
А>Полная хрень получается: с рендерером все нормально, есть пауза; а с кодеком в мр3 (для отладки после него я поставил фильтр-дампер, который мне показывает семплы, выдаваемые мр3-кодеком) — пока ему приходит буфер, заполненый нулями, он вообще не чухается, как только начинают идти данные (промаркированный уже черт-знает каким временем) он вдупляется и начинает кодить, выдавая семплы, которые помечает с нуля и дальше — т.е. мои много-секунд тишины (а ему не все ли равно, тишина там или что) кодеком игнорируются
в общем, тупил как всегда я: для эксперимента стал подставлять вместо тишины нарастающий тон (код из примера в ffmpeg-е взял) — получил прерывистый звук, 1/4 секунды нужный тон, след. 1/4 секунды — шум, и снова по очереди тон/шум
что оказалось: для звука 22 кГц моно 1/4 секунды это:
22050 семплов * 1 канал * 16 бит ->
44100 байт в 1 секунде звука ->
44100 / 4 = 11025 байт в 1/4 секунды —
т.е. нечетное количество байт меня как-то совсем не насторожило млин!..
идиот и полный кретин, быдлокодер чертов, чтоб еще про себя сказать приятного.. как только стал отдавать правильные порции, так мр3-кодек стал все правильно кодить..
Re[9]: Как правильно делать push-source фильтры? я уже нервн