Как правильно делать 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 раза длиннее чем должен бы быть, а при проигрывании все "замерзает" или плеер падает..

Шо характерно, с видео вроде проблем нету, а звук дурит.. где-то я неправ, а где — натыкайте носом что-ли..
ds push-source
Re: Как правильно делать push-source фильтры? я уже нервнича
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 20.05.09 04:11
Оценка:
Стандартный 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 фильтры? я уже нервн
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 20.05.09 13:35
Оценка:
Просто дело не в фильтре, а в том, что и как пишется в 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 фильтры? я уже нервн
От: alxn1 Россия  
Дата: 22.05.09 23:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>надо дискредитировать этот кодек да и все (он на исходниках ламе явно, закладка абоут осталась, но обзывается 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 фильтры? я уже нервн
От: squid  
Дата: 24.05.09 06:00
Оценка:
Здравствуйте, <Аноним>, Вы писали:

ставь 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 фильтры? я уже нервн
От: fat.hamster http://fat-hamster.blogspot.com
Дата: 26.05.09 15:03
Оценка:
Здравствуйте, squid, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


S>ставь ACM версию, он припишется в Audio compressors.


с чего это вдруг (даже в теории)? и на практике — не прописалось..

оказалось дело не в geovid-е, разницы (пока) нет, этот фильтр или "оригинальный" lame..
Re[10]: Как правильно делать push-source фильтры? я уже нерв
От: squid  
Дата: 26.05.09 16:42
Оценка:
Здравствуйте, fat.hamster, Вы писали:

FH>с чего это вдруг (даже в теории)?


ACM кодеки туда маппятся

в Video Compressors кодеки тоже кстати маппятся
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.