Direct Show, остановка ветвей графа
От: Changer Германия  
Дата: 11.04.03 14:16
Оценка:
Хай народ!

Может кто толком знает, как можно останавливать части графа?

Дело в следующем: необходимо обеспечить состояние "Пауза" одной ветви графа во время записи потока. Поток состоит из 2-х составляющих, видео+звук. Всё сыпится на AVI Mux достаточно стабильно и чудесно пишется в avi. При том Preview должен идти дальше.

Есс-но, что в голову приходит — это поставить весь граф на паузу, и все счастливы и довольны, но предпросмотр остановится, и ничего хорошего из всего не получится. Дела в общем... Пробовал входные пины AVI Mux переводить в состояние паузы. Функционирует, но частично: видео-канал встаёт на "паузу", звук пишется дальше. Круто.

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

Bye,
ChR
/ChR
Re: Direct Show, остановка ветвей графа
От: KonstBez  
Дата: 14.04.03 09:43
Оценка:
Здравствуйте, Changer, Вы писали:

C>Хай народ!


C>Может кто толком знает, как можно останавливать части графа?


C>Дело в следующем: необходимо обеспечить состояние "Пауза" одной ветви графа во время записи потока. Поток состоит из 2-х составляющих, видео+звук. Всё сыпится на AVI Mux достаточно стабильно и чудесно пишется в avi. При том Preview должен идти дальше.


C>Есс-но, что в голову приходит — это поставить весь граф на паузу, и все счастливы и довольны, но предпросмотр остановится, и ничего хорошего из всего не получится. Дела в общем... Пробовал входные пины AVI Mux переводить в состояние паузы. Функционирует, но частично: видео-канал встаёт на "паузу", звук пишется дальше. Круто.


C>Если кому знакома проблематика, буду рад конструктивному ответу. А пока... пока буду дальше ковыряться, похоже, что какой-то момент в доке я не допонял...


C>Bye,

C>ChR

Как вариант возможно следующее (хотя сам не пробовал): сделать свой фильтр, построенный на CTransformFilter (не InPlace) и включить его в нужную ветвь графа. Тогда можно будет не пускать на выход (попрорсту херить) данные, не останавливая ветвь, а тем более весь граф.
Re[2]: Direct Show, остановка ветвей графа
От: Changer Германия  
Дата: 14.04.03 17:27
Оценка:
Здравствуйте, KonstBez, Вы писали:

KB>Как вариант возможно следующее (хотя сам не пробовал): сделать свой фильтр, построенный на CTransformFilter (не InPlace) и включить его в нужную ветвь графа. Тогда можно будет не пускать на выход (попрорсту херить) данные, не останавливая ветвь, а тем более весь граф.


Идея хорошая. Однако, думаю мало что принесёт. Тут такие подробности стали по ходу дела выясняться, что во время записи в AVI-файл поток нельзя прерывать. Вернее можно, но вместо паузы будет "пустое" место записанно, которое длится всю паузу. И соответственно получается редкостная фигня. Дело в том что AVI-Mux и File Writer не остановленны и чудесно создают AVI-тэги дальше. Пускай там содержания нет, толку что временная синхронизация никуда не едит, и все дела как в аптеке чётко по времени индексированны. Я пробовал стопорить AVI-микшер достаточно извращенческими методами, получил на выходе, что записанные данные вообще для Мелкософт Медиа Прэйера нечитаемые. Стал ковыряться, имхо дело там закопано во внутреннее время графа(reference time), и соответственно индексироваться микшером. Ну а что произойдёт, если его мы стопорнём? Он останется в "прошлом", а данные валиться на него будут уже из "настоящего" после паузы. Пробовал корректировать время у него — ничего не приносит, как и следовало ожидать. Не знаю в общем, похоже я какие-то моменты не учёл, что так всё криво получается.

Ладно, в лоб проблему не удалось решить, я пошёл на жертвы: предположил, что фик со всем, а хоть в режим паузы можно загнать весь граф во время записи? Ответ: данет. Всё классно работает, даже со своими родными фильтрами, что я написал. ОДНАКО! Билиберда получается, если в графе нечаянно всплывает видео-кодек(плевать какого пошиба, перепробовал всякие , то вся штука после старта после паузы вываливает чудесненькую ошибку: time stamp у пакета кривой. Ну дела... Выкидываю видео-кодек — лаванда! Всё чудесно работает, вставляю — меня куда-то опять дайрект шоу посылает.

В общем, имхо тематика несколько палёная и не поддаётся лечению напрямую. Что-то на сегодня все хорошие мысли закончились.

2All: мож у кого-нить есть какие-нить идеи и соображения?

/ChR
/ChR
Re[3]: Direct Show, остановка ветвей графа
От: Блудов Павел Россия  
Дата: 15.04.03 01:12
Оценка:
Здравствуйте, Changer, Вы писали:

C>2All: мож у кого-нить есть какие-нить идеи и соображения?


Ну а если реализовать IReferenceClock, который будет
прятать дыры во времени?

Павел.
Re[4]: Direct Show, остановка ветвей графа
От: Changer Германия  
Дата: 15.04.03 11:23
Оценка: 12 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>Ну а если реализовать IReferenceClock, который будет

БП>прятать дыры во времени?

В принципе идея должна сработать. Однако, не так просто всё в реализации. Насколько я понимаю, необходимо после паузы все фильтры графа проиницилизировать на состояние до паузы, я про внутреннее время графа. Правда что мне не нравится — слишком уж глобально для паузы всё как-то, ещё не факт что граф после такой операции "оживёт" корректно и вообще, позволит ли всё "на лету" проинитить. В последнем я сильно сомневаюсь, всё-таки 100 миллисекунд может оказаться мало для того чтобы обойти весь граф, да ещё операционка задавленна кодеками и другими потоками, что у меня живут. Останавливать граф, нельзя — всё равно после старта он будет иметь уже другие временные значения.

Я сколько не копался в инете, но нигде не увидел удачных реализаций подобной фичи(паузы во время записи). К неудачной, но частично работающей пожалуй можно отнести мелкософтовскую, где стоит клёвая приписка, что IAMStreamControl может не у всех capture pins работать. Похоже у меня(или не только у меня...) похожий случай с звуковой картой... карта не стара и даже актуальна. Но всё ставит под знак вопроса, будет ли вообще у других корректно работать? Хотелось бы обратить внимания, что товарищи из мелкософта(я про amcap) выкидывают аудиоустройство со всеми причандалами из графа вообще(зачем? Почему бы просто не отрубить capture pin и всё!?), если отключена запись звука. Всё это наводит на мысли, что они где-то там проблем поимели, и к чему я тоже приплыл.

Мне тут приходят идеи, забить временно на решение паузы во время записи(пока необходимая и интересующая инфа не всплывёт), и просто обрывать запись как обычно. И после записи трэдом с низким приоритетом склеивать 2, 3, 4... авишников вместе. И всё. Пускай и не красиво как хочется, однако как обычно получается после многих попыток: "бросай дедукцию, давай продукцию!"
/ChR
Re: Direct Show, остановка ветвей графа
От: Аноним  
Дата: 15.04.03 11:48
Оценка:
Здравствуйте, Changer



Э есть в принципе-то другой подход к ентому делу !!!

знаш так мона делать CаllBack кадров из основного потока а уж потом собирать их в авишку самому
вот вам и пауза и все че хош .....
Re[2]: Direct Show, остановка ветвей графа
От: Kuper  
Дата: 16.03.04 11:11
Оценка:
Здравствуйте, 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. Это то?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.