2015-06-15 2 views
2

Я разрабатываю симулятор webrtc в среде Linux с использованием языка C. Здесь мне нужно отправить медиа с одного симулятора webrtc на другой симулятор webrtc. Мне нужно работать с кодеками VP8 и Opus. Теперь я начинаю с кодека VP8. Поскольку я новичок в VP8, любезно помогите мне понять и больше.Parsing VP8/OPUS frames

  1. Поскольку это симулятор, я не хочу захватывать/воспроизводить медиа в реальном времени. Мне нужно прочитать аудио/видео данные из файла и отправить его на удаленный. На пульте дистанционного управления извлеките данные мультимедиа, сохраните их в файл.

  2. В каком формате файла содержатся закодированные данные VP8? Это формат веб-файла или что-то еще?

  3. Предполагая, что файл webm содержит данные кодека VP8 и OPUS (что я не уверен), как я могу разделить кадр за кадром. Например, если я читаю Extract audio frames from AMR-NB file, я могу анализировать кадры amr из файла. Точно так же есть страница справки, где я изучаю логику разбора для кадра VP.

  4. Или есть ли какой-либо открытый исходный код с использованием этого, я могу разбирать кадры VP8/OPUS из файла webm.

+1

Да, это webM. Посмотрите на это http://www.webmproject.org/code/ –

+0

Майкл, спасибо за ввод. Я проверил libwebm. Он имеет несколько исполняемых файлов, таких как sample, sample_muxer, dumpvtt. Который я должен следовать, это sample.cpp Мне нужно проверить и понять. Looks sample.cpp объясняет парсер Matroska. Но я ищу парсер VP8/Opus. Как Matroska связана с VP8 и OPUS. Пожалуйста, дайте мне знать. – Kamal

ответ

2

Q2: Начну с вопроса № 2, VP8 соответствует формату WebM.

Q3: Если вы хотите анализировать кадр за кадром, вам необходимо знать структуру VP8 и OPUS. Я не знаю, что означает симулятор в вашем сценарии, но в среде WebRTC медиаданные передаются через RTP. Если вы выполняете симуляцию без RTP, пожалуйста, начните с шага 2, в противном случае начните с № 1.

  1. Деадаптируйте полезную нагрузку RTP из пакета RTP. Полезная нагрузка RTP содержит информацию о пакете VP8, такую ​​как порядковый номер, временную метку и т. Д.
  2. Обратите внимание, что кадр VP8 может состоять из нескольких пакетов VP8, поэтому в основном вам необходимо извлечь содержимое фрейма и объединить его вместе. Существует несколько способов узнать, состоит ли кадр из нескольких пакетов, но не все они полностью стандартизованы, но на данный момент я бы рекомендовал вам использовать порядковый номер, так как пакеты одного кадра имеют один и тот же SEQ.
  3. Запишите рамку в файл. Если вы хотите создать действительный файл WebM, используйте функцию, например av_write_frame() из LibAV (которую я лично использую).

Я могу порекомендовать вам фрагмент кода, который фактически преобразует необработанные пакеты RTP VP8 в рамки VP8: https://github.com/meetecho/janus-gateway/blob/master/postprocessing/pp-webm.c. Чтение заголовка пакета используется в функциях (предварительный процесс и процесс).

Q4: Я использую LibAV для таких целей (альтернативно FFMPEG).

Я с удовольствием отвечу на любой другой вопрос.

+0

спасибо. Я буду использовать RTP. Мой сценарий - это нечто вроде симулятора simulator1. Simulator1 будет читать файл webm, получать аудио- и видео данные и отправлять на Simulator 2.Поэтому сначала мне нужно прочитать файл webm, проанализировать VP8 или OPUS-кадр, отправить в Simulator 2. Simulator2 при получении данных VP8/OPUS будет записывать в файл. Я предполагаю, что файл webm содержит данные vp8 и opus (не сырые данные). Поэтому я могу читать vp8 и opus закодированные данные из файла webm и отправлять их в simulator2. Есть ли какой-нибудь пример кода, который я могу назвать. Выше ссылка будет полезна на стороне simulator2 при записи данных в файл. – Kamal

+0

Для чтения я бы использовал av_read_frame, я нашел этот пример. Ваш источник будет, конечно, WebM-файлом, а не потоком в реальном времени (RTSP). http://hasanaga.info/tag/ffmpeg-libavcodec-av_read_frame-example/ – golstar

+0

Этот пример выглядит намного лучше: https://ffmpeg.org/doxygen/2.1/doc_2examples_2demuxing_8c-example.html Что должно быть интересно для вас - av_read_frame и av_decode_video2. – golstar