Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.04.2015, 01:40
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Вылетает ошибка при повторной проверке аудио файла компонентом NewAC

Доброе время суток форумчане,
Для воспроизведения звука использую компонент NewAC. Т.к. я записываю аудио файл в БД, то перед этим, я его проверяю:
Код:
if OpenDialog1.Execute then
  begin
    MP3In1.FileName := OpenDialog1.FileName; //step 1
    if not MP3In1.Valid then
    begin
      showmessage(C_audio_not_valid);
      Exit;
    end;
    MP3In1.Free;
Взял стандартный код из примера компонента (за исключением последней строки).
И вот когда я записываю файл первый раз в БД, - все нормально.
Но последующие разы, программа выкидывает ошибку:
Debugger Exception Notification
Project PEng_gDB.exe raised exception class EAccessViolation with message 'Access violation at address 00538514 in module 'PEng_gDB.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue
.

Перед ошибкой, компилятор проходит «step 1», и выкидывает в файл («unit ACS_Classes») модуля компонента, на строку «step 2»:
Код:
 procedure TAuFileIn.SetFileName;
  begin
    CloseFile;               //step 2
//    StartSample := 0;
//    EndSample := -1;
    FWideFileName := FN;
    FFileName := FN;
  end;

такое впечатление, как будто, я забыл что-то закрыть.
Программа пример «MP3Player» (самого компонента), отрабатывает все на ура. Да и моя программа воспроизводит все файлы подряд.
А вот когда я проверяю файл (без воспроизведения) – летит ошибка.
Может кто-нибудь здесь подскажет, в чем заковыка?

Заранее спасибо.
Ответить с цитированием
  #2  
Старый 27.04.2015, 14:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,718
Репутация: 52347
По умолчанию

Видимо вы благополучно грохаете ваш MP3In1, а потом пытаетесь к нему обратится, на что и получаете AV
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Konstantin-78 (27.04.2015)
  #3  
Старый 27.04.2015, 15:08
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Видимо вы благополучно грохаете ваш MP3In1, а потом пытаетесь к нему обратится, на что и получаете AV

Да возможно вы и правы, но
за кодом, приведенном в первом листинге, идет строка:
Код:
TBlobField(ibdsService.FieldByName('SPEAK')).LoadFromFile(OpenDialog1.FileName);

В которой, я загружаю файл в БД. И без "MP3In1.Free;", у меня на загрузке вылазит другая ошибка:

"Cannot open file "D:\Prog\Eng_gdb\Sound\help.mp3". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.",

Может можно как нибудь другим способом, освобождать файл (в "MP3In1.FileName := OpenDialog1.FileName;")?
Ответить с цитированием
  #4  
Старый 27.04.2015, 15:14
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Да вы были правы,
вместо
Код:
MP3In1.Free;
я воспользовался
Код:
MP3In1.Reset;
И ошибка ушла.
Спасибо.
Ответить с цитированием
  #5  
Старый 27.04.2015, 15:30
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Можно еще один вопрос,
вот, когда я воспроизвожу звук из базы:
Код:
begin
    PrSpeak := TMemoryStream.Create;
    TBlobField(ibqEmpty.FieldByName('SPEAK')).SaveToStream(PrSpeak);
    PrSpeak.Seek(0, soFromBeginning);
    MP3In1.Stream := PrSpeak; 
    DXAudioOut1.Run;
  end

А потом пытыюсь записать проверенный файл в БД
Код:
if OpenDialog1.Execute then
  begin
    MP3In1.FileName := OpenDialog1.FileName;
    if not MP3In1.Valid then
    begin
      showmessage(C_audio_not_valid);  //step 3
      Exit;
    end;
    MP3In1.Reset;
у меня срабатывает step 3 и программа вываливается.
Без предварительного воспроизведения, файл проходит проверку и записывается в БД

Последний раз редактировалось Konstantin-78, 27.04.2015 в 15:35.
Ответить с цитированием
  #6  
Старый 27.04.2015, 17:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Видимо файл занят в этот момент проигрывателем, требуется что-то типа Close
Ответить с цитированием
  #7  
Старый 27.04.2015, 17:35
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Я тоже так думал,
но в момент выпадения ошибки, я файл могу физически с диска удалить.
и ошибка выпадает на строке step 4 (модуля "libwma1;" компонента):
Код:
function TAudioStream.Read;
   begin
     pcbRead^ := FStream.Read(pv^, cb);  //step 4
     if pcbRead^ <> 0 then Result := S_OK
     else Result := -1;
   end;
и я уже и "MP3In1.Reset" и "MP3In1.Stream.Free;" - пробовал, но это немного не то...

Последний раз редактировалось Konstantin-78, 27.04.2015 в 17:39.
Ответить с цитированием
  #8  
Старый 27.04.2015, 17:40
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Попробуйте ещё тогда позицию мемпотока перед записью на ноль выставить, может во время воспроизведения она сбивается, а назад не возвращается, в смысле PrSpeak.Position:= 0
Ответить с цитированием
  #9  
Старый 27.04.2015, 17:47
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Попробуйте ещё тогда позицию мемпотока перед записью на ноль выставить, может во время воспроизведения она сбивается, а назад не возвращается, в смысле PrSpeak.Position:= 0

Вы хотели сказать перед проверкой (потому что до записи он и так не доходит),
Код:
PrSpeak.Position:= 0;
    MP3In1.FileName := OpenDialog1.FileName;
    if not MP3In1.Valid then
    begin
      showmessage(C_audio_not_valid);
      Exit;
    end;

всеравно "собака" ругается.
Нее... это в компоненте, что-то не освобождается :-(

Есть еще вариант, использовать два компонента "MP3In" (один для записи, другой для воспроизведения), но это как-то не правильно

И вообще, после каждого воспроизведения:
Код:
procedure TFMain.DXAudioOut1Done(Sender: TComponent);
begin
  PrSpeak.Free;
  sbSpeak.Down := false;
end;

Последний раз редактировалось Konstantin-78, 27.04.2015 в 20:39.
Ответить с цитированием
  #10  
Старый 27.04.2015, 17:55
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Konstantin-78
...Есть еще вариант, использовать два компонента "MP3In" (один для записи, другой для воспроизведения), но это как-то не правильно
А это работает? Тогда как раз это и правильно
Ответить с цитированием
  #11  
Старый 27.04.2015, 18:03
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
А это работает? Тогда как раз это и правильно

Конечно работает, два разных компонента...:-)
Но всеравно, некрасиво как-то. (2 одинаковых компонента, последовательно выполняют по сути одну и ту же простую работу)

Последний раз редактировалось Konstantin-78, 27.04.2015 в 18:06.
Ответить с цитированием
  #12  
Старый 27.04.2015, 20:55
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Оказалось все гораздо проще (нужно только help внимательно читать :-))
"...To unassign this property set it to nil..."
но это в принципе то, о чем писал Alegun
После всего, нужно делать:
Код:
MP3In1.Stream := nil;

В примере по компоненту использовался для воспроизведения файл, та не учавствовал поток...
А я делал:
Код:
MP3In1.Stream.Free;

Последний раз редактировалось Konstantin-78, 27.04.2015 в 21:00.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram