Могу ли я кодировать или декодировать видео в Android с помощью OpenCORE или StageFright?

Предоставляет ли эта платформа Android возможности для разработки функций кодирования и декодирования для одного приложения Android?

Я знаю, что есть один высокоуровневый API с 4.1 под названием MediaCodec, который дает возможности для кодирования и декодирования видео, но я не знаю, действительно ли он использует одну из этих медиа-платформ в качестве Stagefright для доступа к кодекам.

Каковы преимущества кодирования или декодирования с использованием одной из этих платформ по сравнению с использованием MediaCodec API?

Может быть, я очень запутался, но мне нужно сделать проект о кодировании с помощью Android-видео, и я должен выбрать лучший вариант для этого, если кто-нибудь может мне помочь...


person javiaf    schedule 26.11.2012    source источник


Ответы (2)


Вы должны использовать API MediaCodec, а не API более низкого уровня. После этого API MediaCodec будет использовать соответствующую внутреннюю структуру. Это связано с тем, что поставщики Android будут интегрировать свои собственные кодеки и кодеки с аппаратным/dsp-ускорением в платформу и устанавливать их по умолчанию для API MediaCodec. Они позаботятся о том, чтобы их кодеки работали с API MediaCodec. Если вы используете MediaCodec API, он будет работать на всех устройствах, независимо от используемой ниже платформы. Вот для чего этот API.

Если вы специально не хотите провести какое-то тестирование с OpenCore/Stagefright, не ходите туда.

person av501    schedule 28.11.2012
comment
Спасибо за ответы. Итак, если Android 4.1 теперь использует инфраструктуру StageFright, значит, MediaCodec будет использовать кодеки, интегрированные в эту инфраструктуру, не так ли? Но у меня вопрос, до выпуска MediaCodec API как происходил процесс кодирования одного видео, например, в h.264 с использованием железа одного устройства? Можете ли вы привести мне один пример? Есть ли какая-то польза (например, по времени) от выполнения задачи непосредственно с помощью фреймворков? - person javiaf; 29.11.2012
comment
@user1735358 user1735358, для кодирования всегда был доступен Java API высокого уровня. Если я прав, MediaCodec на самом деле является доступом более низкого уровня в рамках Java. MediaPlayer/MediaRecorder всегда был доступен. MediaCodec был добавлен для обеспечения контроля нижнего уровня. Если вам не нужен доступ более низкого уровня, вы должны использовать MediaPlayer/MediaRecorder - person av501; 29.11.2012
comment
Вау, еще раз спасибо @av501, хотя MediaPlayer и MediaRecorder предназначены только для записи видео/аудио и их воспроизведения. Можно ли записывать видео с камеры с помощью этих классов, используя HW-кодирование от MediaCodec? Идея моего проекта состоит в том, чтобы записывать видео в необработанном формате и кодировать его с помощью устройства HW. Как вы думаете, можно ли подключиться к MediaRecorder или мне поискать другие классы? Спасибо!! - person javiaf; 03.12.2012
comment
@javiaf, получение необработанного формата возможно, но неэффективно, он не будет работать со скоростью более 10 кадров в секунду, за исключением телефонов самого высокого уровня. Я не понимаю, чего вам нужно достичь. Если вы хотите захватить с камеры, вы можете захватить необработанное видео. Если вы хотите кодировать с использованием лучшего HW-кодека на устройстве, поверьте мне, производитель уже сделал его конфигурацией MediaRecorder по умолчанию, поэтому вам следует просто использовать его. Если вы хотите сохранить YUV и отдать его из поона для кодирования в другом месте, то да, вы можете это сделать. - person av501; 03.12.2012
comment
идея состоит в том, чтобы захватить видео с камеры и кодировать с помощью HW для отправки видео, закодированного с использованием RTP. Идея заключается в том, чтобы кодировать быстрее, чем sw, но, насколько я понимаю, MediaRecorder делает одну кодировку SW самостоятельно, поэтому было бы бесполезно делать одну кодировку HW, потому что видео уже закодировано. Итак, что я хочу сделать, это записать, закодировать с помощью HW, а затем отправить по сети. Если вы хотите сохранить YUV и отдать его из поона для кодирования где-нибудь еще, тогда да, вы можете это сделать -> Можете ли вы рассказать мне об этом подробнее? - person javiaf; 04.12.2012
comment
Если вы хотите кодировать на телефоне, мне все еще не ясно, какое HW вы хотите использовать? MediaRecorder будет использовать на реальном устройстве с аппаратным кодировщиком hw encoder. Если вы хотите кодировать вне телефона, вам нужно сохранить yuv на SD-карте, затем вытащить ее и затем кодировать. Я предполагаю, что вы просто хотите использовать самый быстрый кодировщик, доступный на устройстве, который любой производитель уже реализовал бы на устройстве. - person av501; 04.12.2012
comment
Ах!! Значит, MediaCodec хорош для аппаратного кодирования из внешних видеофайлов, не так ли? Я имею в виду, если у вас есть один файл, декодированный в одном формате, и вы хотите его закодировать, тогда используйте MediaCodec, но если вы хотите захватить с камеры устройства, тогда MediaRecorder кодирует поток видео с помощью кодеков HW, это правильно? Хорошо, вы спросили меня, какие кодеки я хочу использовать? Существует класс MediaCodecInfo, который говорит, какие кодеки HW может использовать ваше устройство, поэтому я хотел бы сделать одно приложение, которое в принципе проверяет, какие кодировщики может использовать ваше устройство, а затем вы можете выбрать, закодировать его и (не моя работа) отправить это по RTP. - person javiaf; 04.12.2012
comment
developer.android.com/reference/android/media/ Один пример: как я могу гарантировать, что если один Nexus 4 может кодировать в H.264 с использованием низкого уровня, как может проверить MediaCodecInfo, когда я пишу это: recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); кодеки, которые я использую, являются кодеками HW, а не кодеками SW? С этим ответом я думаю, что моя проблема почти решена. - person javiaf; 04.12.2012
comment
Вы ничего не можете гарантировать. Производитель модифицировал Android, чтобы сделать это для него. Так что если его нет, то и не будет. Но все приличные телефоны будут использовать кодировщик h/w, а не кодировщик s/w из соображений производительности. В противном случае вы не получите всех спецификаций кодирования, которые они выдают. - person av501; 04.12.2012

То, что вы пытаетесь сделать, делается поставщиком/интегратором. Лучшим решением было бы (если у вас есть доступ к настроенному исходному коду платформы -> если нет, используйте любую бесплатную плату) интегрировать ваш HW enc с libstagefright (как компонент OMX), таким образом, вы будете кодировать YUV вместе с инкапсуляцией в любой желаемый (из поддерживаемых) формат, тогда вы можете использовать высокоуровневый rtp API для инкапсуляции и управления потоковой передачей (просто сделайте вывод из ответа дяди Google об Android и rtp).

person Ryszard Grzesica    schedule 26.01.2013