Заставьте GStreamer правильно считывать FLV-файлы с поврежденной информацией о видео

#gstreamer #video-encoding #flv #streaming-flv-video

Вопрос:

У меня есть набор файлов FLV, которые я хочу воспроизвести с помощью GStreamer. Все файлы имеют неверный заголовок/метаданные, как этот:

https://drive.google.com/file/d/1FcKbYd2-D7ZiIG5VpRxpbqshCixp8iaR/view?usp=sharing

И VLC, и ffplay могут воспроизводить этот файл, используя свою особую магию. Хотя Mediainfo показывает усеченную информацию о видео для файла:

 Video
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Codec ID                                 : 7
Duration                                 : 12 s 633 ms
Frame rate mode                          : Constant
Frame rate                               : 60.000 FPS
Bit depth                                : 8 bits
 

Для правильных файлов существуют, по крайней мере, профиль формата и уровень.

gst-discoverer-1.0 вообще не хочет обнаруживать видеопоток:

 Properties:
  Duration: 0:00:00.116000000
  Seekable: yes
  Live: no
  container: Flash
    audio: MPEG-4 AAC
      Stream ID: a72c1038e0bf52d7668cb945588d7bca2547bd58212aa7f08db439aeadfcbd95/audio
      Language: <unknown>
      Channels: 2 (front-left, front-right)
      Sample rate: 48000
      Depth: 32
      Bitrate: 0
      Max bitrate: 0
    video: H.264
      Stream ID: (NULL)
      Width: 0
      Height: 0
      Depth: 0
      Frame rate: 0/1
      Pixel aspect ratio: 1/1
      Interlaced: false
      Bitrate: 0
      Max bitrate: 0
 

gst-play-1.0 запускается, но показывает ошибки и не показывает предварительный просмотр:

 gst-play-1.0.exe "C:UsersmeDownloadscustom.flv"
Press 'k' to see a list of keyboard shortcuts.
Now playing C:UsersmeDownloadscustom.flv
WARNING No decoder available for type 'video/x-h264, stream-format=(string)avc, codec_data=(buffer)000000016742c020da014016ec0440000003004000001e03c60ca80000000168ce3c80'.
WARNING debug information: ../gst/playback/gsturidecodebin.c(960): unknown_type_cb (): /GstPlayBin:playbin/GstURIDecodeBin:uridecodebin0
Redistribute latency...
0:00:12.6 / 0:00:12.6
Reached end of play list.
 

Я ищу любой способ либо заставить GStreamer правильно воспроизводить такие файлы (может быть, есть какой-нибудь плагин, позволяющий это сделать?), либо исправить заголовок видео.

Ответ №1:

Обновите свой видеофайл с помощью FFMPEG:

 ffmpeg -i custom.flv -c:v copy -c:a copy fixed.flv
 

Комментарии:

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

2. Ну, вы просили способ исправить это, чтобы оно играло в GStreamer. Вам нужно изучить битовый поток и сравнить его со спецификацией, если вы хотите знать, что в нем не так.

3. "...What information is incorrect in the headers and how to fix them?" @AntonSerov Я проверю ваш FLV позже, но обычно FFmpeg генерирует новый заголовок на основе собственных настроек аудио/видеокодека. Например, если в заголовке FLV указано, что по- width = 0 прежнему можно получить ширину и высоту из заголовка PPS видео в байтах H264 (Набор параметров изображения).

4. Спасибо @VC. Один! Проблема была в основном в заголовке. Для создания заголовка я использовал дополнительные данные, возвращаемые кодировщиком FFmpeg. Но заголовок-это не просто дополнительные данные, он должен быть сгенерирован как AVCDecoderConfigurationRecord в соответствии с ISO/IEC-14496-15

Ответ №2:

Проблема была в заголовке видео. Для создания заголовка я использовал дополнительные данные, возвращаемые кодировщиком FFmpeg. Но заголовок-это не просто дополнительные данные, он скорее должен быть сгенерирован как AVCDecoderConfigurationRecord структура в соответствии со стандартом ISO/IEC-14496-15.