Может кто толком знает, как можно останавливать части графа?
Дело в следующем: необходимо обеспечить состояние "Пауза" одной ветви графа во время записи потока. Поток состоит из 2-х составляющих, видео+звук. Всё сыпится на AVI Mux достаточно стабильно и чудесно пишется в avi. При том Preview должен идти дальше.
Есс-но, что в голову приходит — это поставить весь граф на паузу, и все счастливы и довольны, но предпросмотр остановится, и ничего хорошего из всего не получится. Дела в общем... Пробовал входные пины AVI Mux переводить в состояние паузы. Функционирует, но частично: видео-канал встаёт на "паузу", звук пишется дальше. Круто.
Если кому знакома проблематика, буду рад конструктивному ответу. А пока... пока буду дальше ковыряться, похоже, что какой-то момент в доке я не допонял...
Здравствуйте, Changer, Вы писали:
C>Хай народ!
C>Может кто толком знает, как можно останавливать части графа?
C>Дело в следующем: необходимо обеспечить состояние "Пауза" одной ветви графа во время записи потока. Поток состоит из 2-х составляющих, видео+звук. Всё сыпится на AVI Mux достаточно стабильно и чудесно пишется в avi. При том Preview должен идти дальше.
C>Есс-но, что в голову приходит — это поставить весь граф на паузу, и все счастливы и довольны, но предпросмотр остановится, и ничего хорошего из всего не получится. Дела в общем... Пробовал входные пины AVI Mux переводить в состояние паузы. Функционирует, но частично: видео-канал встаёт на "паузу", звук пишется дальше. Круто.
C>Если кому знакома проблематика, буду рад конструктивному ответу. А пока... пока буду дальше ковыряться, похоже, что какой-то момент в доке я не допонял...
C>Bye, C>ChR
Как вариант возможно следующее (хотя сам не пробовал): сделать свой фильтр, построенный на CTransformFilter (не InPlace) и включить его в нужную ветвь графа. Тогда можно будет не пускать на выход (попрорсту херить) данные, не останавливая ветвь, а тем более весь граф.
Здравствуйте, KonstBez, Вы писали:
KB>Как вариант возможно следующее (хотя сам не пробовал): сделать свой фильтр, построенный на CTransformFilter (не InPlace) и включить его в нужную ветвь графа. Тогда можно будет не пускать на выход (попрорсту херить) данные, не останавливая ветвь, а тем более весь граф.
Идея хорошая. Однако, думаю мало что принесёт. Тут такие подробности стали по ходу дела выясняться, что во время записи в AVI-файл поток нельзя прерывать. Вернее можно, но вместо паузы будет "пустое" место записанно, которое длится всю паузу. И соответственно получается редкостная фигня. Дело в том что AVI-Mux и File Writer не остановленны и чудесно создают AVI-тэги дальше. Пускай там содержания нет, толку что временная синхронизация никуда не едит, и все дела как в аптеке чётко по времени индексированны. Я пробовал стопорить AVI-микшер достаточно извращенческими методами, получил на выходе, что записанные данные вообще для Мелкософт Медиа Прэйера нечитаемые. Стал ковыряться, имхо дело там закопано во внутреннее время графа(reference time), и соответственно индексироваться микшером. Ну а что произойдёт, если его мы стопорнём? Он останется в "прошлом", а данные валиться на него будут уже из "настоящего" после паузы. Пробовал корректировать время у него — ничего не приносит, как и следовало ожидать. Не знаю в общем, похоже я какие-то моменты не учёл, что так всё криво получается.
Ладно, в лоб проблему не удалось решить, я пошёл на жертвы: предположил, что фик со всем, а хоть в режим паузы можно загнать весь граф во время записи? Ответ: данет. Всё классно работает, даже со своими родными фильтрами, что я написал. ОДНАКО! Билиберда получается, если в графе нечаянно всплывает видео-кодек(плевать какого пошиба, перепробовал всякие , то вся штука после старта после паузы вываливает чудесненькую ошибку: time stamp у пакета кривой. Ну дела... Выкидываю видео-кодек — лаванда! Всё чудесно работает, вставляю — меня куда-то опять дайрект шоу посылает.
В общем, имхо тематика несколько палёная и не поддаётся лечению напрямую. Что-то на сегодня все хорошие мысли закончились.
2All: мож у кого-нить есть какие-нить идеи и соображения?
Здравствуйте, Блудов Павел, Вы писали:
БП>Ну а если реализовать IReferenceClock, который будет БП>прятать дыры во времени?
В принципе идея должна сработать. Однако, не так просто всё в реализации. Насколько я понимаю, необходимо после паузы все фильтры графа проиницилизировать на состояние до паузы, я про внутреннее время графа. Правда что мне не нравится — слишком уж глобально для паузы всё как-то, ещё не факт что граф после такой операции "оживёт" корректно и вообще, позволит ли всё "на лету" проинитить. В последнем я сильно сомневаюсь, всё-таки 100 миллисекунд может оказаться мало для того чтобы обойти весь граф, да ещё операционка задавленна кодеками и другими потоками, что у меня живут. Останавливать граф, нельзя — всё равно после старта он будет иметь уже другие временные значения.
Я сколько не копался в инете, но нигде не увидел удачных реализаций подобной фичи(паузы во время записи). К неудачной, но частично работающей пожалуй можно отнести мелкософтовскую, где стоит клёвая приписка, что IAMStreamControl может не у всех capture pins работать. Похоже у меня(или не только у меня...) похожий случай с звуковой картой... карта не стара и даже актуальна. Но всё ставит под знак вопроса, будет ли вообще у других корректно работать? Хотелось бы обратить внимания, что товарищи из мелкософта(я про amcap) выкидывают аудиоустройство со всеми причандалами из графа вообще(зачем? Почему бы просто не отрубить capture pin и всё!?), если отключена запись звука. Всё это наводит на мысли, что они где-то там проблем поимели, и к чему я тоже приплыл.
Мне тут приходят идеи, забить временно на решение паузы во время записи(пока необходимая и интересующая инфа не всплывёт), и просто обрывать запись как обычно. И после записи трэдом с низким приоритетом склеивать 2, 3, 4... авишников вместе. И всё. Пускай и не красиво как хочется, однако как обычно получается после многих попыток: "бросай дедукцию, давай продукцию!"
/ChR
Re: Direct Show, остановка ветвей графа
От:
Аноним
Дата:
15.04.03 11:48
Оценка:
Здравствуйте, Changer
Э есть в принципе-то другой подход к ентому делу !!!
знаш так мона делать CаllBack кадров из основного потока а уж потом собирать их в авишку самому
вот вам и пауза и все че хош .....
Здравствуйте, KonstBez, Вы писали:
KB>Здравствуйте, Changer, Вы писали:
C>>Хай народ!
C>>Может кто толком знает, как можно останавливать части графа?
C>>Дело в следующем: необходимо обеспечить состояние "Пауза" одной ветви графа во время записи потока. Поток состоит из 2-х составляющих, видео+звук. Всё сыпится на AVI Mux достаточно стабильно и чудесно пишется в avi. При том Preview должен идти дальше.
C>>Есс-но, что в голову приходит — это поставить весь граф на паузу, и все счастливы и довольны, но предпросмотр остановится, и ничего хорошего из всего не получится. Дела в общем... Пробовал входные пины AVI Mux переводить в состояние паузы. Функционирует, но частично: видео-канал встаёт на "паузу", звук пишется дальше. Круто.
C>>Если кому знакома проблематика, буду рад конструктивному ответу. А пока... пока буду дальше ковыряться, похоже, что какой-то момент в доке я не допонял...
C>>Bye, C>>ChR
Привет, чувак по горю !!!
Для остановки части графа я делал следующее, хотя как я думаю этот подход довольно таки извратный.
Я полностью останавливал весь граф и разрывал связь между фильтрами, после чего запускал граф — зто всё происходит довольно таки бастро. Если же надо было присоеденить часть графа на место я делал реконект — то есть делал соеденение по пинам. Вот типо и пауза!!!
Но тут есть один подвох. Если так разамкнуть часть графа и потом поменять имя выходного фаила, то первый фаил после этого не читается, в отличии от второго. Видимо при таком раскладе в первый файл чёто не дописывается, а при закрытие приложения граф сам автоматически дописывает инфу во второй фаил. Я думаю может есть дополнительный фильтор который позволяет контролировать запись в фаил?
Re[2]: Direct Show, остановка ветвей графа
От:
Аноним
Дата:
17.03.04 10:03
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Changer
А>Э есть в принципе-то другой подход к ентому делу !!!
А>знаш так мона делать CаllBack кадров из основного потока а уж потом собирать их в авишку самому А>вот вам и пауза и все че хош .....
Странно это. Я может не вьехал. Но я спокойно писал фильтр. Вставлял его перед рендером и он мне выдал на рендер 1 кадр в секунду вместо 30. Это то?