Конференция "Media" » Удалить часть данных из открытого файла
 
  • AlexOld (02.10.08 11:21) [0]
    Файл большого размера (видеофильм, не AVI) открывается как типизированный или нетипизированный. Он содержит испорченные кадры. Как их удалить, не затрагивая остальные?
  • Сергей М. © (02.10.08 11:28) [1]
    Можно подумать, что ты знаешь как это сделать затрагивая остальные ?
  • AlexOld (02.10.08 11:52) [2]
    Программа просмотра позволяет просматривать фильм по кадрам. Испорченный сразу виден. Известен указатель на него, но не знаю, как удалить этот кадр (в типизированном файле), или известное число байт от указанного адреса в нетипизированном.
  • Palladin © (02.10.08 12:16) [3]
    чья программа?
  • AlexOld (02.10.08 12:29) [4]
    Программа моя. Справка: файл представляет собой набор яркостей (ч/б) пикселей, в каждом кадре 576х768 пикселей. Просмотр как типиз. или нетипиз. файла с помощью указателя и выводом на экран.
  • Сергей М. © (02.10.08 12:29) [5]

    > Известен указатель на него


    Указатель указывает не на кадр, а на адрес в адресном пространстве процесса.
  • AlexOld (02.10.08 12:36) [6]
    Сергею М.
    Естественно, это я написал для сокращения. Можно записывать целые кадры в новый файл функциями FileWrite или BlockWrite, но это дольше, чем удалить испорченные данные из оригинала.
  • Сергей М. © (02.10.08 13:34) [7]

    > AlexOld   (02.10.08 12:36) [6]


    Ну хорошо, давай ближе к телу.

    Покажи код, который у тебя делает это "дольше" чем тебе хотелось бы ..
  • AlexOld (02.10.08 13:58) [8]
    var
    FHandle: Integer;     //Дескриптор открытого файла видео
    FSHandle: Integer;   //Дескриптор файла, куда сохраняю целые кадры
    bytes: Byte;           //число байт на пиксел
    Procedure TForm1.SaveKadres;
    var
      i: Integer;
    begin
      if SaveDialog3.Execute then  begin
      FSHandle:= FileCreate(SaveDialog3.FileName);
      StartKadr:= StrToInt(Trim(Form2.edStartKadr.Text))-1;
      EndKadr:= StrToInt(Trim(Form2.edEndKadr.Text));
         for i:= StartKadr to EndKadr do
         begin
      FileSeek(FHandle,bytes*576*768*i,0);
      FileRead(FHandle,FileArray,bytes*cl*768);
      FileWrite(FSHandle,FileArray,bytes*cl*768);
         end;
    end;
    И так для всех целых кадров, только пишу в открытый файл.
  • Palladin © (02.10.08 14:24) [9]
    А по другому никак. Единственное можно просто сдвинуть целые кадры (грубо говоря куски информации), которые после попорченных на их место попорченных, будет чуток быстрее. Но естественно оригинальный файл не сохранится и если накосячишь... то накосячишь
  • Сергей М. © (02.10.08 14:32) [10]
    И где тут идет фигурирует файл именно видеофильма ?

    Я вижу обычный структурированный файл, содержащий последовательность блоков данных фиксированного размера, каждый из которых представляет собой несжатые растровые данные с фиксированным разрежением и глубиной цвета.

    Ни заголовка нет, ни чего-то еще характерного даже для слайд-шоу, не говоря уже о видеотреке ..

    А что в данном случае считается "испорченным кадром" ?
  • Sapersky (02.10.08 15:45) [11]
    Как вариант - при удалении кадра копировать последний на его место и обрезать файл на 1 кадр, а чтобы сохранить последовательность при воспроизведении - добавить к файлу таблицу размещения кадров, в которой будет прописано, где какой кадр лежит. Таблицу можно писать в конец, зарезервировав 1-е 4(8) байтов в начале файла как смещение таблицы.
  • antonn © (03.10.08 01:40) [12]

    > Ни заголовка нет, ни чего-то еще характерного даже для слайд-
    > шоу, не говоря уже о видеотреке ..

    "Видеотрек" не имеет никакого отношения ни к формату ни к технологии как таковой. (с) почти Сергей М. :)
    достаточно того, что его программа кушая этот файл показывает быстро сменяющиеся кадры, что обычно называют "видео", "кино".

    Испорченый кадр может представлять собой "испорченую картинку". Это такой набор байт, который не имеет смысла в контексте всего "видеотрека" (так, на всякий случай, вдруг будет еще один приступ букводности).
    Итого автору нужно было посоветовать как быстро сместить блок данных от конца испорченого кадра и до конца файла к началу плохого кадра, тем самым удалив испорченый кадр. Зачем лить воду и запутывать автора буквоежкиными методами - не понятно.
  • Сергей М. © (03.10.08 08:07) [13]

    > Зачем лить воду и запутывать автора буквоежкиными методами
    > - не понятно


    Затем что вопрос не имеет к медиа ни малейшего отношения - с тем же успехом вопрос про быструю перезапись структурированного файла можно задать в "Начинающие" и не парить мозги про кадры и их "испорченность")
  • Сергей М. © (03.10.08 08:12) [14]

    > Итого автору нужно было посоветовать как быстро сместить
    > блок данных


    Вот возьми и посоветуй)

    Только по сути это будет просто не более чем оптимизированный алгоритм тех же самых манипуляций с файлами источника и приемника.
  • AlexOld (06.10.08 16:04) [15]
    Всем спасибо. Я и сам думал, зачем мой вопрос поместили в мультимедиа?
    А по поводу смещения целой части назад на место испорченного кадра - испорченных кадров может быть больше десяти. Испорченный кадр - сбои при записи через фрейм-граббер. Наверное, лучший выход - писать-таки целые кадры в новый файл после просмотра и фиксации испорченных.
  • antonn © (06.10.08 16:08) [16]
    может вместо испорченого писать последний перед ним, с меткой error в уголке? чтобы не моргало и не дергалось
 
Конференция "Media" » Удалить часть данных из открытого файла
Есть новые Нет новых   [133926   +456][b:0][p:0.001]