2016-11-30 4 views
-1

Я пытаюсь загрузить видео с альтернативной версии сайта Ustream. Этот сайт, по-видимому, используется для защиты DRM, ведь вы не можете смотреть это видео без доступа к нему через логин с этого сайта. Видеосистема должна быть такой же, как и в ustream (те же самые ссылки), которая каждые шесть секунд вызывает различные фрагменты flv и объединяет их в поток (аналогично службе rtmp, но не использует этот протокол).Слияние .flv фрагментов с сайта потока

Мне удалось загрузить каждый фрагмент .flv, составляющий это видео, но у меня возникли проблемы с их объединением в один файл. Прежде всего эти файлы flvs имеют некоторые аудио/видео задержки/проблемы, но поскольку нет другого способа скачать это видео, я не жалуюсь на лага.

Настоящая проблема заключается в том, что каждый файл flv имеет добавочный прирост продолжительности, несмотря на нормальный размер. Продолжительность видео составляет около 6 секунд, поэтому первый фрагмент длится 6 секунд, второй кусок - 12 секунд, хотя видны только первые 6 (остальные 6 «повреждены»). Если я попытаюсь объединить (с ffmpeg или любым программным обеспечением для присоединения к видео), все эти файлы (около 600-700, на общую продолжительность 1 час и 15 минут) будут видны только первые два раздела, тогда я ничего не вижу. (Яснее, если я попытаюсь объединить первые 2 куска, файл длится 18 секунд, и я могу увидеть первые 12, если я попытаюсь объединить первые 3 куска, файл длится 36 секунд, и я все еще могу видеть только первые 12 секунд.)

У кого-нибудь есть идеи?

+0

Stack Overflow предназначен для программирования вопросов, поэтому вы должны показать свой код. – LordNeckbeard

+0

Ну, я не знаю, прочитал ли вы вопрос, но нет кода для показа. То, что я попросил, было методом объединить flv-фрагменты в подобной/идентичной среде (где каждый следующий фрагмент приносит длительность предыдущих). Команда объединения является стандартной. Моя проблема заключается в получении реальной продолжительности кусков. Я думал что-то об обрезке каждого .flv-файла, но есть 700 файлов, и мне приходится обрезать один час минус 6 секунд в последних. – Iztooi

+0

@Iztooi хотя бы покажет нам команду ffmpeg "merge". Может быть, это неправильно, например, как вы сливаете только 2 или 3 flv? Получил ссылку на два примера последовательных кусков? Необходимо проверить, есть ли у каждого блока отдельный собственный заголовок FLV и как выглядят эти временные метки. В принципе, если chunk-1 заканчивается на отметке времени 6 секунд, тогда chunk-2 не может иметь первый кадр с отметкой времени 0. В таком случае вам нужно удалить заголовок flv chunk-2 и отредактировать метку времени в каждом кадре, чтобы увеличить ее с 6 секунд вверх. Использует ли ваш язык кодирования обработку байтов? Или попробуйте команду ffmpeg 'genpts'? –

ответ

0

Я проверил куски FLV. Временные метки на самом деле хорошо.

Краткая версия:
У блока 1 есть ненужный заголовок FLV. Удалите его и вставьте данные в конец Chunk-0. Сделайте это с помощью инструмента Hex Editor или напишите базовую утилиту для автоматического исправления каждого файла на вашем языке кодирования (PHP? Java? C++? Вы не отметили в своем Вопросе).

Чтобы избежать кода, используйте только FFmpeg, попробуйте извлечь видео и аудиоматериалы, содержащиеся в каждом блоке FLV. Например:

ffmpeg -i chunk1.flv -c:v copy chunk1.h264 //to get video 
ffmpeg -i chunk1.flv -c:a copy chunk1.aac //to get audio 
  • Слияние отдельных видео файлов (H264) в один большой файл h264 видео.
  • Объедините отдельные аудиофайлы (aac) в один большой аудиофайл AAC.
  • Присоединяйтесь к видеофайлу & аудиофайлу как внутри FLV, так и MP4-контейнера.

Длинная версия:

Проблема заключается в том, что оба ломти каждый имеют FLV заголовок (первые 13 байт в каждом файле).
Только Chunk-0 нуждается в заголовке, потому что Chunk-1 является просто продолжением видео, где он дает следующие 6 секунд FLV-файла.

Чтобы представить вашу проблему, давайте посмотрим на внутренности ваших FLV. Как показано, после удаления дополнительных байтов вы можете просто вставить оставшиеся байты Chunk-1 в конце Chunk-0, а затем повторно сохранить файл working FLV.

Так просто использовать язык программирования для кода программы с простой логикой:

Для каждого номера по возрастанию куска, который не Chunk-0, удалять свои первые 13 байт и вставьте остальные в конце Chunk-0.flv.

Повторяйте с каждым фрагментом, пока у вас не будет большой FLV-файл Chunk-0 полной продолжительности.

В качестве теста вы можете вручную отредактировать куски вручную, используя бесплатное программное обеспечение для шестнадцатеричного редактора. В Windows я использую HxD. Над ним захватываются изображения.

  • Открыть обе глыбы в шестнадцатеричном редакторе
  • На Chunk-1 просто выберите (выделения) & удалить первые 13 байт заголовка FLV (в диапазоне от 0 до 12). Заголовок начинается с 46 в слоте 0 и заканчивается 00 в слоте 12.
  • Следующие байты начинаются с 09 (видеокадр). Похоже 09 00 25 FF 00 17 etc etc
  • Вы хотите Chunk-1, чтобы начать с этих байтов вместо текущего 46 4C 56 01 etc etc
  • Наконец ... просто ("Select All" и) вырезать все Chunk-1 байт и паста те байтов в конце Chunk-0. Сохраните как новый FLV и попробуйте сыграть. Это будет работать!!

Это результат working FLV.

+1

Спасибо за ваш ответ. Мой вопрос состоял в том, чтобы найти, что было странным поведением файлов flv; и это была «ненужность» из 13 байтов заголовка. Итак: ваша ссылка не работает, но я смог воспроизвести процесс и получить то, что, по моему мнению, является одним и тем же файлом. Я не могу использовать извлечение аудио-видео, так как он может (или не может, я не очень эксперт) уменьшить качество. Поскольку я помню, что я объединил разные FLV-файлы с другого сайта/видео с помощью команды concat, я думал, что есть что-то подобное, но поскольку вам нужно скопировать все байты в один файл, я могу сделать это, как вы сказали – Iztooi

Смежные вопросы