Как я могу мультиплексировать (или инкапсулировать) вывод H.264 RTP в контейнер с помощью FFMPEG?

Я работаю над последствиями сетевых потерь при передаче видео. Чтобы смоделировать потери в сети, я использую простую программу, которая отбрасывает случайные пакеты RTP из выходных данных кодирования H.264 RTP.

Я использую Joint Model (JM) 14.2 для кодирования видео. Однако я не использую формат AnnexB в качестве вывода, вместо этого я выбираю вывод в виде пакетов RTP. Выходные данные JM формируются в виде пакетов RTP с заголовками RTP и полезной нагрузкой в ​​виде последовательности. После этого часть RTP-пакетов отбрасывается с помощью простой программы. Затем я могу декодировать выходной битовый поток, используя также JM и его методы маскировки ошибок.

Основной целью этого процесса является оценка различий, создаваемых сетевыми потерями, в восприятии качества видео человеком. Для измерения воспринимаемого качества отображаемое видео должно быть в декодированном виде (т. е. в полном разрешении) или оно может декодироваться на стороне приемника. Пакеты RTP, созданные кодировщиком JM, не могут быть декодированы без установленного программного обеспечения JM. Однако при правильном заголовке (или контейнере) большинство видеоплееров способны декодировать битовый поток. Итак, моя цель в этом вопросе — инкапсулировать битовый поток моего закодированного RTP-пакета в общий контейнер, такой как AVI или MP4, чтобы мой контент мог быть декодирован на компьютере-получателе.

Формат закодированного битового потока в пакетной форме RTP выглядит следующим образом:

     ----------------------------------------------------------------------
     | RTP Header #1 | RTP Payload #1 | RTP Header #2 | RTP Payload #2 |...
     ----------------------------------------------------------------------

Чтобы найти качество видео, я хочу провести субъективный тест с этими битовыми потоками. Я могу провести эти тесты, используя декодированные данные в полном разрешении, в то время как очень неудобно использовать краудсорсинг этого субъективного теста с ГБ видеоданных в Интернете. Итак, я хочу мультиплексировать эти битовые потоки в контейнер (например, AVI) с помощью FFMPEG. Я пытался декодировать эти битовые потоки с помощью FFMPEG и FFPLAY; однако оба они не сработали. Я также попробовал следующую команду, и она тоже не сработала.

    ffmpeg - f h264 -i <raw_rtpDropped.264> -vcodec copy -r 25 out.avi

Какой формат или мультиплексор следует использовать? Нужно ли конвертировать эти файлы в какой-либо другой формат?


person Grad    schedule 09.08.2013    source источник
comment
Если я не ошибаюсь, вы перепутали мультиплексирование с кодированием. если ваши данные YUV, то они декодированы или необработаны. если вы хотите сжать его, вам нужно его закодировать. если вы хотите хорошее качество/низкий битрейт, выберите кодировщик h264 (-vcodec h264, я верю).   -  person NiRR    schedule 18.08.2013
comment
Нет, я не путаюсь в терминах. Я закодировал свое видео с помощью JM и получил вывод в режиме пакетов RTP, а не в режиме AnnexB. После того, как я получу свои закодированные двойные потоки, мне нужно их декодировать, чтобы показать субъектам. Но я не хочу декодировать и получать ГБ видео YUV (raw). Вместо этого я хочу мультиплексировать эти битовые потоки в AVI (или MP4, контейнер не имеет значения) для хранения видеоданных в гораздо меньших размерах. Так что видео можно разместить на каком-то сервере, и я могу направлять субъектов (или зрителей/избирателей) на эту веб-страницу. Это самый простой способ краудсорсинга. Так что мне нужно мультиплексирование :)   -  person Grad    schedule 20.08.2013


Ответы (1)


Думаю, я попытаюсь убедить вас еще раз: кодирование — это метод получения необработанного видео и его сжатия. Это уменьшит размер видео, чего вы и хотите, а также уменьшит качество (нельзя получить что-то просто так). Мультиплексирование — это термин, используемый во многих науках и означающий преобразование двух или более потоков данных в один. такие как транспорт mpeg2 или контейнеры на основе mpeg4 ISO. AVI также является контейнером/мультиплексом видео (отсюда и название «чередование аудио-видео»), поэтому он не решает вашу проблему с гигабайтами данных. из Википедии: «Файл AVI может содержать аудио/визуальные данные внутри фрагментов практически в любой схеме сжатия, включая Full Frame (без сжатия), Intel Real Time (Indeo), Cinepak, Motion JPEG, Editable MPEG, VDOWave, ClearVideo / RealVideo, Видео QPEG и MPEG-4».

person NiRR    schedule 23.09.2013
comment
Для моей цели видео должно быть либо декодировано (то есть в полном разрешении), либо декодировано в месте назначения. Мультиплексирование (или инкапсуляция) закодированных пакетов RTP необходимо, чтобы избежать передачи необработанных данных YUV. Я уже умею кодировать видео и знаю, что такое контейнер. Закодированные битовые потоки H.264 в пакетной форме RTP (не в форме Приложения B, которая имеет заголовки NALU 0x001) не могут быть декодированы на стороне получателя без JM. Однако при правильном заголовке (или контейнере) большинство видеоплееров способны декодировать битовый поток. Я изменил вопрос, чтобы объяснить себя лучше. Пожалуйста, проверьте. - person Grad; 07.10.2013
comment
Если я правильно понимаю, у вас есть h264, не входящий в приложение B, инкапсулированный в эту специальную вещь rtp, которую может декодировать только JM, и вы хотите разделить rtp и поместить h264 во что-то еще, что можно легко демультиплексировать, а затем декодировать. Контейнеры на основе iso (mp4, frv) регулярно используются вместе с не-приложением B, но проблема в том, что без приложения B кодировщик не знает параметры потока (разрешение, структура изображения и т. д.), которые обычно находятся в приложение B, это дополнительные данные в заголовках RTP? ffmpeg, вероятно, не знает, что с ними делать, вы можете создать данные вручную? - person NiRR; 07.10.2013
comment
Да, это моя проблема. Ffmpeg обычно получает параметры из заголовков заданных данных. Даже если предположить, что у RTP-пакетов нет заголовков, ffmpeg может легко получить их из входных параметров. Увы, мне нужна эта команда ffmpeg, потому что я не смог найти ее в Интернете. Я не понял часть вашего вопроса... можете ли вы создать данные вручную? Если вопрос в том, знаю ли я разрешение, структуру и т. д., я могу предоставить эту информацию ffmpeg. Если вопрос заключается в создании закодированных данных битового потока вручную, я явно не могу. :) - person Grad; 12.10.2013
comment
Я мало что знаю о JM, но можете ли вы вывести тот же фильм в формате AnnexB, а также RTP, а затем воссоединить заголовки Annex B с потоком позже? - person NiRR; 13.10.2013
comment
Это может быть хорошей идеей, но также может быть трудно определить, какая потеря пакетов RTP соответствует какому фрагменту AnnexB. Моя главная цель состояла в том, чтобы найти команду ffmpeg для облегчения моей работы. :( - person Grad; 14.10.2013