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