Как Video4Linux и ALSA работают с кодеками
Насколько я понимаю, кодек - это и декодер, и спецификация для декодирования. Поэтому некоторые группы пишут кодек, который объясняет, как декодировать их формат обратно в исходный поток битов, и они оставляют реализацию кодирования любому, кто хочет написать совместимый кодер. Так, например, h.264 - это известный видеокодек (декодер), а x264 - это известный FOSS-кодер для h.264. Но есть много других кодеров h.264.
Насколько я понимаю, VideoForLinux (V4L2) - это набор библиотек ядра и пространства пользователя для работы с потоковым видео на компьютерах с Linux.
Насколько я понимаю, ALSA - это набор библиотек ядра и пространства пользователя для работы с потоковым аудио на компьютерах с Linux.
Если что-то, что я изложил выше, неверно, пожалуйста, начните исправлять / разъяснять меня!
Если предположить, что я более или менее прав, то мне не удается понять, какую роль (если таковые имеются) должны играть V4L2 и ALSA при попытке кодировать, сжимать и передавать аудио- и видеопотоки на компьютере с Linux.
Если бы я мог использовать x264 для кодирования моего видеопотока, faac для кодирования моего аудиопотока, а затем ffmpeg
чтобы сжать, мультиплексировать и передать два потока, скажем, в контейнере MPEG-TS, тогда где вступают в игру V4L2 и ALSA?
И если ответ "они этого не делают", то кто-нибудь может привести пример или два, когда будет использоваться V4L2/ALSA , чтобы я мог представить их в контексте и понять случаи использования, где они необходимы? Заранее спасибо.
2 ответа
Просто тонкая деталь, большинство кодеков начинаются как спецификации, определяющие формат, и методологии, с помощью которой происходит кодирование и декодирование, включая спецификации API, если применимо. Оттуда могут быть созданы реализации как кодера, так и декодера. Не все реализации созданы равными. Например, декодер CoreAVC H.264 является многопоточным, тогда как многие другие реализации - нет.
V4L2 в основном используется для создания / захвата видео в системах Linux, поэтому в него встроен кодировщик (или, скорее, он ссылается на внешний). Он в основном используется для веб-камер и видеозахвата / телевизионных карт. Смотрите больше в Википедии. Приложения, которые создают необработанные потоки, используют V4L2 для кодирования видео по своему вкусу. Декодирование выполняется другим пакетом (возможно, libavcodec).
ALSA содержит кодеки, но сама является стеком поддержки для всех аудио операций в Linux, поэтому, где бы вы ни слышали звук, ALSA делает то, что происходит. Я уверен, что ALSA имеет компоненты для аудиовхода (микрофон / линейный вход), поэтому он должен быть способен к некоторой форме кодирования, но я не работал с этим.
В вашем примере я не верю, что V4L2 будет задействован вообще, поскольку вы используете кодер H.264, который, вероятно, обеспечивает гораздо лучшее качество и производительность, чем V4L2. ALSA будет использоваться для воспроизведения вашего видео, но не будет использоваться для его кодирования.
Когда вы играете любой звук, это ALSA на работе. Когда вы используете свою веб-камеру, это L4V2 на работе.
Что касается ffmpeg, ALSA и V4L2 называются устройствами ввода, а не кодеками (не то, что термин кодек всегда точен - я обычно называю что-то кодером и / или декодером, чтобы быть более конкретным). Другие устройства ввода включают в себя JACK, pulse, x11grab, iec61883, dv1394 и т. Д. Из документации FFmpeg:
Устройства ввода - это сконфигурированные элементы в FFmpeg, которые позволяют получить доступ к данным, поступающим с мультимедийного устройства, подключенного к вашей системе.
Например, вы можете использовать ALSA для записи звука с микрофона, который подключен к вашей звуковой плате. Вы можете использовать V4L2 для захвата видео с веб-камеры. Базовая, непроверенная пример команды:
ffmpeg -f video4linux2 -i /dev/video0 -f alsa -i hw:0 output.mkv
Вы упоминаете:
h.264 - известный видеокодек (декодер)
H.264 - это стандарт, а не кодек. FFmpeg имеет декодер с именем h264
, Это может сбить с толку. См. Что такое кодек (например, DivX?) И чем он отличается от формата файла (например, MPG)?