Консультация № 187237
30.03.2013, 16:35
184.74 руб.
0 1 0
Здравствуйте! Прошу помощи в следующем вопросе . У меня появилась задача написать для определенных целей видеоплеер. В целом, обычный плеер с парой специальных функций. Я его написал в QtCreator (использую С++ и модуль phonon), все работает, он выполняет те функции, для которых предназначался, но есть один нюанс, который критичен для этого плеера: время, которое показывает плеер, и реальное время видео не совпадают, если проматывать файл. Плеер должен работать с фильмами, которые дают на dvd-дисках (расширение VOB) для выполнения определенной работы, и к этим фильмам прилагается вшитый таймкод. Когда я стал проверять свой плеер, то заметил, что при промотке таймкод и время плеера идут асинхронно, притом по-разному, т.е. то время плеера отстает от таймкода, то наоборот. К тому же с разными разрывами, то 2 секунды разрыв, то 10 сек, и если несколько раз помотать, то разрывы меняются, они даже могут устраняться и таймкод и время плеера снова пойдут синхронно. Если не мотать, то проблем нет, все идет синхронно, с одной скоростью. Ничего о подобной проблеме в интернете не нашел. Еще я проверил фильмы с таймкодом на других плеерах: Media Player Classic, VLC Palyer, Gom. Оказывается, везде такая же проблема, как и на моем плеере. Притом эта проблема происходит именно с файлами с диска, с расширением VOB, с обычными avi, mkv никакой асинхронности нет. Кроме того, я заметил, что этой проблем нет на плеерах, которые предназначены для проигрывания DVD файлов, например, PowerDVD. Windows Media и стандартный плеер на Macbook'e тоже проигрывают vob'ы без асинхронности.

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


Приложение:
//Заголовочный файл

class MediaPlayer : public QMainWindow
{
Q_OBJECT

private:


public:
Phonon::AudioOutput* audio;
Phonon::MediaObject* media;
QLCDNumber *timeLcd; //индикатор для отображения времени
QString strTime; // строка для хранения времени


public slots:
void tick(qint64 time); // слот для получения времени
}

//файл MediaPlayer.cpp

MediaPlayer::MediaPlayer(){
media = new Phonon::MediaObject(this);
audio = new Phonon::AudioOutput(Phonon::VideoCategory, this);
Phonon::VideoWidget* video = new Phonon::VideoWidget;

Phonon::createPath(media, audio);
Phonon::createPath(media, video);

connect(media, SIGNAL(tick(qint64)), this, SLOT(tick(qint64)));
connect(media, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
this, SLOT(stateChanged(Phonon::State,Phonon::State)));
}

void MediaPlayer::tick(qint64 time){

QTime displayTime((time/3600000) % 60 ,
(time/60000) % 60, (time / 1000) % 60); // получаем время

QString format; //строка для формата времени
format = "hh:mm:ss";

strTime = displayTime.toString(format); // преобразовываем полученное время в строку и задаем формат
timeLcd->display(strTime);//отображаем строку со значением времени на индикаторе
}

Обсуждение

Неизвестный
30.03.2013, 20:29
общий
Лет 5 назад мне попадалась статья вроде бы Касперского по этой проблеме. Вобщем, на "лицензионные" диски добавляется обманная информация специально как защита от копирования. И "настоящие" плейеры, купившие все лицензии и не имеющие права распространять полученную информацию, получают способ игнорировать такие ловушки. А вот остальные - кто во что горазд. Причем часто на плейере вроде все нормально, а на его же перекодировщике выскакивают проблемы. В частности, там были искусственно вставленные повторные фреймы и просто блоки с недостоверной информацией. Статья старая, так что где она была не помню, да и за столько лет ситуация могла улучшиться.
ДВД создавался комитетом киноиндустрии, а они преследуют совсем не те цели, что мы. Там стараются каждый стандарт сделать как можно более запутанным и непоследовательным, чтобы увеличить порог вхождения. Чем более дорогой и недоступной будет работа с их творениями, тем выше будут цены и ниже конкуренция.
PS Но это не значит, что Qt не умеет с ней справляться и это не глюк конкретной версии. Я с этой библиотекой никогда не работал, но она популярная. Ждите ответов от других экспертов. И ищите статьи про грабли в ДВД.
Форма ответа