У меня третий день попытки загрузить одно 4-минутное видео. Это Flash FLV, который разделен на три части, первые две около 5 МБ, третья около 3 МБ.

Только первая часть имеет нормальные заголовки FLV, следующие две имеют в основном только FLV в начале. Я не пытался написать что-то сам, просто скачал и попробовал пару сотен мегабайт программного обеспечения для Windows, которое на самом деле этого не делает.

Поскольку оказывается, что нет необходимости загружать видео части, вы можете извлечь их из кеша вашего браузера, как только вы просмотрели его один раз. Я пробовал CamStudio захватывать видео с экрана во время воспроизведения, но мой самый быстрый компьютер недостаточно быстр.

Я не могу сделать это в реальном времени. Я хотел бы сделать это из OpenBSD, но у меня есть одна машина, загруженная в Windows, потому что нет Flash для OpenBSD. Я могу воспроизвести его с помощью MPlayer (Windows или OpenBSD), пытаясь сделать простое объединение частей с помощью MEncoder, чтобы получить видео, которое останавливается при первом разделении. Пробовал FFmpeg тоже. Я хотел бы преобразовать его во что-нибудь более нормальное, например, MP4 или AVI.

Спецификация 10.1 сильно отличается от 10.0 (горячая ссылка на PDF)

Три FLV в MC Viewer (изображение); первое совсем другое:

ссылка на сайт

2 ответа2

0

Пока не полный ответ, но FLVMeta и частичное чтение спецификации Adobe начинают проливать свет на вещи. Из полного дампа FLVMeta теги или разделы данных выглядят так:

    --- Tag #1019 at 0xCBEB5 (835253) ---
    Tag type: audio
    Body length: 213
    Timestamp: 124957
    * Sound type: stereo
    * Sound size: 16
    * Sound rate: 44
    * Sound format: AAC
    Previous tag size: 224
    --- Tag #1020 at 0xCBF99 (835481) ---
    Tag type: video
    Body length: 1201
    Timestamp: 124960
    * Video codec: AVC
    * Video frame type: inter frame
    Previous tag size: 1212
    --- Tag #1021 at 0xCC459 (836697) ---
    Tag type: audio
    Body length: 225
    Timestamp: 124980
    * Sound type: stereo
    * Sound size: 16
    * Sound rate: 44
    * Sound format: AAC
    Previous tag size: 236
    --- Tag #1022 at 0xCC549 (836937) ---
    Tag type: video
    Body length: 542
    Timestamp: 125000
    * Video codec: AVC
    * Video frame type: inter frame
    Previous tag size: 553

Таким образом, вы можете прочитать заголовок в один файл, поместить все теги в 1 файл каждый, а затем преобразовать столько входных файлов в любое количество выходных файлов, сколько вам нужно. Каждый "тег" я бы назвал блоком, но это кусок данных. Вам не нужно манипулировать ими в режиме реального времени. У каждого есть метка времени, вам просто нужно собрать их вместе в таком порядке и не разбивать теги по файлам.

Мне бы хотелось, чтобы у FLVMeta был более полезный вывод для перемещения объектов под управлением программы, таких как табуляция или данные, разделенные запятыми. Возможно, даже создайте базу данных SQLite для каждого проекта, поместите все аудиотэги в одну таблицу, видео в другую, сценарий в другую. Возможно я сделаю это еще, так как это с открытым исходным кодом и на Github. Было бы проще, если бы у flvs не был порядок с прямым порядком байтов, а я на машине с прямым порядком байтов. Все целые числа имеют порядок байтов, как на Mac.

0

Готово наконец. Я закончил тем, что использовал программу на C, которую я написал, чтобы объединить их, как только я решил ошибку, заключающуюся в том, что EOF в первом входном файле заканчивался как FF или -1 в выходном файле, что останавливало проигрыватели и конвертеры в этой точке.

flvmeta по-прежнему выдавал предупреждения на выходе этого, но я смог преобразовать его в mp4, используя:

    ffmpeg -i out4.flv -vcodec copy -acodec copy out4.mp4


    /*
       My flv concat, a single-use program
    */

    #include <stdio.h>  // don't need most of these headers
    #include <stdlib.h>
    #include <string.h>
    #include <endian.h>  // FLVs have big endian values
    #include <unistd.h>
    #include <fcntl.h>
    #include <inttypes.h>

    FILE *opf;

    void docopy(char *fn, uint ofs) {
      FILE *ipf;
      unsigned char ch;
      ipf = fopen(fn,"r");
      if (ipf == NULL) {
        printf("Failed to open %s\n",fn);
        fclose(opf);
        exit(1);
      }
      fseek(ipf,ofs,SEEK_SET);  // jump to passed in offset
      while (!feof(ipf)) {  // not super efficient
        ch = fgetc(ipf);
      // this DOES have an effect, it stops the -1 from being written
        if (!feof(ipf))
          fputc(ch,opf);
      }
      printf("outfile now at %x\n",(unsigned int) ftell(opf));
      fclose(ipf);
    }

    void outhdr(void) { // write boilerplate flv header
      opf = fopen("out4.flv","w");
      if (opf == NULL) {
        printf("Error creating new output file.\n");
        exit(1);
      }
      fprintf(opf,"FLV%c%c%c%c%c%c",1,5,0,0,0,9); // audio and video enabled
      // This becomes the first PreviousTagSize:
      fprintf(opf,"%c%c%c%c",0,0,0,0);  // flvmeta seems to approve
    }

    int main(void) {
      outhdr();  // write a vanilla header
      docopy("media1.flv", 13);  // copy, starting at byte 13
      docopy("media2.flv", 13);
      docopy("media3.flv", 13);
      fclose(opf);
      return 0;
    }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .