Как объединить сплит FLV файлы?

1435
Alan Corey

У меня третий день попытки загрузить одно 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 (изображение); первое совсем другое:

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

0
Вы проверили, нет ли буквально одного файла в 3 кусках? Как с `cat chuck1 chuck2 chunk3> file.flv` infixed 8 лет назад 0
Кстати, ffmpeg может принять видео .flv в качестве формата контейнера. Когда я транскодировал для дерьмового нетбука без хорошей поддержки h264 (но с поддержкой mpeg2), я использовал такие вещи, как `ffmpeg -i input.flv -acodec libmp3lame -vcodec mpeg2video -qscale 5 -y out.mkv` infixed 8 лет назад 0
Да, кот был первым, что я попробовал, но это не просто разделение. Если я смотрю на файлы с помощью средства просмотра в mc, у каждой части есть такие поля, как video_format, start_time, video_codec. Я думаю, что зритель интерпретирует их, потому что я не вижу этого в необработанных байтах файла. Но только первая часть приемлема для mplayer и т. Д. Как flv и play. Alan Corey 8 лет назад 0
Я использовал mencoder больше, чем ffmpeg. Интересно про контейнер. Я думаю, что если я попытаюсь написать что-то, мне нужно проанализировать первый заголовок и передать его, а затем скопировать полезные данные и объединить их. В каждом заголовке есть время начала, и я думаю, что продолжительность, чтобы я мог получить их в правильном порядке, а не полагаться на даты внешнего файла. Alan Corey 8 лет назад 0
Я использовал ffmpeg для объединения файлов с разными кодеками еще раньше. попробуйте что-то вроде `ffmpeg -i file1.flv -i file2.flv -i file3.flv -filter_complex concat = n = 3: v = 1: a = 1 -acodec libmp3lame -vcodec mpeg2video -qscale 5 -y out.mkv` Извините, я не могу проверить, правильно ли это infixed 8 лет назад 0
Я получаю "поток обнаружен после того, как голова уже проанализирована", затем он видит видео h264 и аудио aac Alan Corey 8 лет назад 0
Я получаю «поток обнаружен после того, как голова уже проанализирована», затем он видит видео h264 и поток аудио aac. Затем "отсутствует картинка", "нет кадра" и т. Д. Но он находит потоки во всех 3 файлах, я вижу частоту кадров, кодеки h264 / aac. Говорит, что я должен увеличить анализируемость и проверить, но этого нет на странице руководства. Alan Corey 8 лет назад 0
Пытался исследовать 20000 и анализировать 5000000 после поиска в Google. По-прежнему отсутствует картинка, а затем «ошибка настройки фильтров» в конце. Alan Corey 8 лет назад 0
https://ffmpeg.org/pipermail/ffmpeg-user/2013-March/014297.html, кажется, обсуждает это. infixed 8 лет назад 0
попробуйте использовать ffmpeg для преобразования файлов `.flv` в файлы` .ts`. Предполагается, что мультиплексирование транспортных потоков позволяет объединять фрагменты путем объединения. Если только он не начинает жаловаться на отметки времени. Я думаю, что это может быть проблематично infixed 8 лет назад 0
Дамп в поток не работает, потому что он только правильно открывает первый файл, попробовал это и с mencoder. У меня были свои исследования и анализ на почти весь размер файла. Поместите большой грязный журнал на http://devio.us/~ab1jx/log4a.txt Alan Corey 8 лет назад 0
к сожалению, я нахожусь в месте, где поиск очень странных мест в сети помечен. Я надеялся, что когда вы сказали «он находит потоки во всех файлах», он мог бы извлечь каждый поток изолированно. Если вы перекодируете в TS, то вы сможете просто просмотреть файлы. Но не намного больше я могу сделать для вас сейчас infixed 8 лет назад 0
devio - это просто бесплатная учетная запись оболочки, размещенная на компьютере с OpenBSD, возможно, они странные. Если посмотреть на содержимое файлов flv в программе просмотра mc, то первый из них сильно отличается: на самом деле там читаемый текст. Такие слова, как copyleft, deadzone, decimate, ограничены в любом случае. Не в более поздних файлах, только подпись FLV в первых 3 байтах. Я получил файл TS от первого. Второе дало 0-байтовый файл TS, и ffmpeg, по-видимому, вышел из него. Alan Corey 8 лет назад 0
FLV может иметь встроенные команды Flash. Большинство сайтов фильмов просто используют в качестве контейнера, поэтому транскодирование работает. Я на самом деле чувствую себя безопаснее, перекодируя flv в другой контейнер, потому что кто знает, может ли кто-нибудь выяснить, как поместить вредоносную флэш-память во flv. Но они могут попробовать что-то необычное. Может быть, у них есть вспышка в первой части, которая захватывает файл второй части infixed 8 лет назад 0
Вредоносная программа - часть того, почему я обычно не использую Windows или Flash. Я предполагаю, что это просто продолжение. Общее время выполнения - 4:34, а первый файл - 1:49. Всего 3 файла - 14,49 мегабайта, первый - 5,6, то есть 38% по времени и размеру. Я поставил терм вместе с автором Andy's FLV http://www.videohelp.com/software/Andys-FLV-Joiner, но это не совсем правильно, каждое преобразование в другой формат умирает при первом соединении. mplayer проигрывает все время, но показывает неправильное время выполнения. Alan Corey 8 лет назад 0
Я только что скомпилировал SWF, который загружал это с помощью бесплатного онлайн-декомпилятора на ShowMyCode. И я читаю учебник по ActionScript. Alan Corey 8 лет назад 0
Попробовать скрежет после прочтения этого поста, все равно собирая его. Я нахожусь под OpenBSD большую часть времени, где нет доступной среды Flash. Гнаш случается в портах. http://stackoverflow.com/questions/20194270/convert-compressed-swf-to-mp4 Alan Corey 8 лет назад 0
Похоже, 2-й и 3-й файлы не являются допустимыми автономными FLV. Вы должны быть в состоянии отследить их, но вам придется выполнять итерацию, удаляя первые n байтов, т.е. cat (flv1, flv2 - первые n байтов, flv3 - n байтов). Я предполагаю, что первые 32 байта. Кроме того, ваш ffmpeg старый. Текущая голова мерзавца 79xxx Gyan 8 лет назад 0
Интересная головоломка. Я думаю, что они действительны, но в спецификации Adobe говорится о чередующихся блоках аудио- и видеоданных с указателями (на самом деле обратными указателями), такими как связанный список. Если данные находятся не там, где указывает указатель, тогда они все разрушают. Я все еще пытаюсь разобраться в 9-байтовом заголовке, который помог Googling за пределами спецификации Adobe. Я думаю, что у первого есть дополнительные метаданные, такие как TIFF или JPEG. В некоторых программах для Windows это видео Flash 9, поэтому я буду использовать ffmpeg в портах OpenBSD, так безопаснее. Скрежет слишком старый. Alan Corey 8 лет назад 0
Наткнулся на flvmeta, милую маленькую утилиту, которая может проверять, записывать, редактировать метаданные в файлах flv. Все эти файлы показывают ошибки и предупреждения, поэтому я запутался, пытаясь написать программу для их устранения в соответствии со спецификацией Adobe. Они написали свой собственный плеер, файлы не должны быть стандартными. Первый тег начинается с байта 13 во всех случаях, но в первом файле он имеет тип scriptData и содержит только метаданные. Теги могут быть аудио, видео или сценария. http://www.flvmeta.com/ Alan Corey 8 лет назад 0

2 ответа на вопрос

0
Alan Corey

Not a complete answer yet but FLVMeta and a partial reading of Adobe's spec are beginning to shine light on things. From an FLVMeta full dump the tags or sections of data look like this:

 --- 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 

So you could read the header into one file, put all the tags into 1 file each, then reconstruct however many input files into however many output files you wanted. Each "tag" I'd call a block, but it's a chunk of data. You don't have to manipulate them in real time. Each has a timestamp, you just have to put them together in that order and don't split a tag across files.

I wish FLVMeta had more useful output for moving things around under program control like tab or comma-delimited data. Maybe even create an SQLite database for each project, put all the audio tags in one table, video in another, script in another. Maybe I'll do that yet since it's open source and on Github. It'd be simpler if flvs weren't big-endian and I'm on a little-endian machine. All integers are big-endian, like on a Mac.

0
Alan Corey

Done finally. I ended up using a C program I wrote to concatenate them once I solved the bug that EOF on the first input file ended up as an FF or -1 in the output file, which stopped players and converters at that point.

flvmeta still gave warnings on the output of this but I was able to convert it to an mp4 using:

 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; } 

Похожие вопросы