От игр, образования, электронной коммерции до развлечений — сценарии применения технологий прямого вещания повсюду. Поскольку скорость Интернета мобильных терминалов становится все выше и выше, популярность и развитие технологии прямого вещания будут еще быстрее.
В этой статье подробно представлена вся картина технологии прямого вещания, охватывающая все аспекты: от сбора аудио и видео в реальном времени, кодирования, передачи до декодирования и воспроизведения. В статье также обсуждаются такие ключевые вопросы, как синхронизация аудио и видео во время прямой трансляции, выбор кодека, протокол передачи и оптимизация задержки прямой трансляции. Я надеюсь, что эта статья предоставит вам более глубокое понимание и практические рекомендации по технологии прямого вещания.
В устройствах Android сбор аудио и видео в основном зависит от двух аппаратных устройств: камеры и микрофона. Камера отвечает за сбор изображений, а микрофон — за сбор звука. Для вызова этих двух устройств Android предоставляет API камеры и API AudioRecord. С помощью этих двух API мы можем легко управлять устройством и получать аудио- и видеоданные. Ниже приведены конкретные практические шаги:
// Camera API
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.setPreviewCallback(previewCallback);
camera.startPreview();
// Camera2 API
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = cameraManager.getCameraIdList()[0];
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] previewSizes = map.getOutputSizes(SurfaceTexture.class);
// Выберите подходящий размер предварительного просмотра
cameraManager.openCamera(cameraId, stateCallback, null);
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, bufferSize);
audioRecord.startRecording();
Качество и плавность сбора аудио и видео во многом зависят от настроек параметров сбора. К этим параметрам относятся разрешение, частота кадров, битрейт и т. д.
При настройке параметров сбора аудио и видео необходимо идти на соответствующие компромиссы с учетом условий сети и производительности устройства. Ниже приведены конкретные практические шаги:
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
parameters.setPreviewFrameRate(frameRate);
camera.setParameters(parameters);
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
В прямом эфире синхронизация аудио и видео является важной проблемой. Чтобы добиться синхронизации, нам нужно добавить метку времени к каждому кадру аудио- и видеоданных. Временная метка записывает время сбора данных и может использоваться для настройки последовательности воспроизведения для обеспечения синхронизации аудио и видео. При декодировании и воспроизведении плеер правильно расположит и воспроизведет аудио- и видеоданные в соответствии с меткой времени.
Чтобы обработать данные и временные метки видеокадра, нам необходимо инкапсулировать собранные данные аудио- и видеокадров и соответствующие временные метки в структуру данных, а затем передать эту структуру кодировщику и модулю передачи. Вот простой способ сделать это:
public class FrameData {
public byte[] data;
public long timestamp;
public FrameData(byte[] data, long timestamp) {
this.data = data;
this.timestamp = timestamp;
}
}
camera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
long timestamp = System.nanoTime();
// Обработка данных и временных меток видеокадров
FrameData frameData = new FrameData(data, timestamp);
// Воля frameData Передано в модуль кодирования и передачи
}
});
while (isRecording) {
long timestamp = System.nanoTime();
int bytesRead = audioRecord.read(buffer, 0, bufferSize);
// Обработка временной метки данных аудиокадра
FrameData frameData = new FrameData(Arrays.copyOf(buffer, bytesRead), timestamp);
// Воля frameData Передано в модуль кодирования и передачи
}
Таким образом, при декодировании и воспроизведении проигрыватель может правильно упорядочивать и воспроизводить аудио- и видеоданные в соответствии с отметкой времени для достижения синхронизации.
Общие форматы кодирования звука включают AAC и Opus. AAC имеет более высокую эффективность кодирования, а Opus лучше работает при общении в реальном времени.
Формат кодирования аудио | преимущество | недостаток | Сценарии использования |
---|---|---|---|
AAC | 1. Высокая эффективность кодирования, позволяющая поддерживать высокое качество звука при более низких скоростях передачи данных. | 1. Слабая оптимизация задержек для общения в реальном времени. | 1. Области коммуникации, не связанные с режимом реального времени, такие как музыка, радиовещание и видео. |
2. Широко используется и хорошая совместимость с оборудованием. | 2. При кодировании речи качество звука не такое хорошее, как у Opus. | 2. Подходит для различных сетевых сред. | |
Opus | 1. Высокое качество звука, особенно подходит для кодирования речи. | 1. Относительно новый, совместимость устройств не такая хорошая, как у AAC. | 1. Общение в реальном времени, такое как VoIP, онлайн-конференции, игровой голос и т. д. |
2. Низкая задержка, подходит для общения в режиме реального времени. | 2. Подходит для широкополосных и узкополосных сетевых сред. | ||
3. Он обладает высокой сетевой адаптируемостью и может автоматически регулировать скорость передачи данных в различных сетевых средах для поддержания качества звука. |
существовать Android Чтобы реализовать кодирование звука в Android предоставил MediaCodec
добрый。MediaCodec
поддерживать Различный Формат кодирования аудио, нравиться AAC и Opus ждать. Чтобы выбрать подходящий формат кодирования, вы можете выполнить следующие шаги:
MediaCodec
кодирование Экземпляр сервера:MediaCodec audioEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);
MediaFormat audioFormat = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, sampleRate, channelCount);
audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
audioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
audioEncoder.configure(audioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
audioEncoder.start();
Распространенные форматы кодирования видео: H.264、H.265 и VP8 ждать. H.264 в настоящее время является наиболее часто используемым форматом кодирования, и H.265 и VP8 носуществовать Лучше в определенных сценарияхизпроизводительность。
Формат кодирования видео | преимущество | недостаток | Сценарии использования |
---|---|---|---|
H.264 | 1. Широко используемое и хорошая совместимость с оборудованием. | 1. По сравнению с H.265 эффективность сжатия ниже. | 1. Видеоконференции, веб-трансляции, обмен видео и т. д. |
2. Высокая эффективность сжатия.,Могут существовать одновременно обеспечить качество видео,Уменьшите количество данных. | 2. Оптимизация задержки для связи в реальном времени слабая. | 2. Подходит для различных сетевых сред. | |
H.265 | 1. Эффективность сжатия чрезвычайно высока, что еще больше снижает объем данных по сравнению с H.264. | 1. Кодирование и декодирование очень сложны и требуют более мощных вычислительных мощностей. | 1. Видео сверхвысокой четкости 4K, 8K, виртуальная реальность и т. д. |
2. Поддерживается более высокое разрешение и большая глубина цвета. | 2. Относительно новый, совместимость устройств не такая хорошая, как у H.264. | 2. Требуются сцены высокого разрешения и четкости. | |
VP8 | 1. Открытый исходный код и бесплатно, патентные пошлины не требуются. | 1. Эффективность сжатия и качество видео не так хороши, как у H.264 и H.265. | 1. сетевой видеозвонок, существуют онлайн-видеосервисы и т.п. |
2. Низкая задержка, подходит для общения в режиме реального времени. | 2. Плохая совместимость устройств. | 2. Существуют требования и сценарии для открытого и бесплатного программного обеспечения. |
существовать Android Чтобы реализовать кодирование видео в , вы также можете использовать MediaCodec
добрый. Чтобы выбрать подходящий формат кодирования, вы можете выполнить следующие шаги:
MediaCodec
кодирование Экземпляр сервера:MediaCodec videoEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaFormat videoFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height);
videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
videoEncoder.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
videoEncoder.start();
Эксплойт аппаратного кодирования GPU руководитькодирование,более высокая производительность,Но совместимость плохая, программное кодирование имеет лучшую совместимость;,Но производительность ниже. существуют в практическом применении,Его необходимо выбирать исходя из характеристик оборудования и потребностей.
существовать Android середина,MediaCodec
Класс автоматически выберет аппаратное и программное устройство кодирования в зависимости от производительности и требований устройства. Чтобы принудительно использовать устройство аппаратного кодирования или устройство программного кодирования, вы можете создать существующее MediaCodec
экземпляр, укажите имя кодировщика. Например, для использования аппаратного обеспечения H.264 Кодировщик, вы можете использовать следующий код:
MediaCodec videoEncoder = MediaCodec.createByCodecName("OMX.google.h264.encoder");
транспортный протокол | Введение | преимущество | недостаток | Соображения |
---|---|---|---|---|
RTMP | на основе TCP из транспортного протокола реального времени, подходящего для сценариев прямой трансляции. | низкая задержка | Высокие требования к сети | Задержка, адаптивность сети, сложность реализации |
HLS | на основе HTTP-изтранспортного протокола, с лучшей иссетью адаптируемости. | Хорошая сетевая адаптируемость | более высокая задержка | Задержка, адаптивность сети, сложность реализации |
WebRTC | поддерживать P2P коммуникацияиз Реальностьчастранспортный протокол,иметьнизкая задержкаи高Реальностьчассекс。 | низкая задержка、高Реальностьчассекс | Высокая сложность и сложность реализации | Задержка, адаптивность сети, сложность реализации |
декодериз Выбор влияет на качество воспроизведенияипроизводительность。в целом,аппаратное обеспечениедекодерболее высокая производительность,Но совместимость плохая, у программного декодера совместимость лучше;,Но производительность ниже. существуют в практическом применении,Его необходимо выбирать исходя из характеристик оборудования и потребностей.
существовать Android , выбор декодера можно сделать через MediaCodec
добрый来Реальность现。MediaCodec
поддерживатьаппаратное обеспечениедекодированиеипрограммное обеспечениедекодирование,Обычно,это будет зависеть от устройствапроизводительностьи Автоматический выбор требованийдекодер。
существоватьрендеринг Аудио и видео, вам необходимо гарантировать аудио и синхронизация видео. Синхронизация может быть достигнута путем калибровки отметки времени или регулировки скорости воспроизведения.
существовать Android рендеринг аудио и видео может осуществляться с помощью SurfaceView
или TextureView
добиться. Чтобы обеспечить аудио и видеосинхронный,Могут рендерить данные каждого кадра,Отрегулируйте скорость рендеринга на основе временной метки. Ниже приведены конкретные практические шаги:
SurfaceView
или TextureView
:SurfaceView surfaceView = new SurfaceView(context);
// или
TextureView textureView = new TextureView(context);
long presentationTimeUs = bufferInfo.presentationTimeUs;
long delayUs = presentationTimeUs - System.nanoTime() / 1000;
if (delayUs > 0) {
Thread.sleep(delayUs / 1000);
}
decoder.releaseOutputBuffer(outputBufferIndex, true);
Чтобы справиться с колебаниями сети, игроку необходимо настроить соответствующую стратегию буферизации. Адаптивная регулировка скорости передачи данных может динамически регулировать качество видео в соответствии с условиями сети, чтобы обеспечить плавность.
существовать Android , стратегия буферизации игрока может быть передана MediaPlayer
или ExoPlayer
из API установить. Адаптивная регулировка скорости передачи данных может быть достигнута за счет ExoPlayer
из TrackSelection
API добиться. Ниже приведены конкретные практические шаги:
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// Обновление прогресса буфера
}
});
// или
ExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).build();
exoPlayer.setBufferedPositionUpdateListener(new ExoPlayer.BufferedPositionUpdateListener() {
@Override
public void onBufferedPositionUpdate(long bufferedPosition) {
// Обновление прогресса буфера
}
});
TrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory();
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context, trackSelectionFactory);
ExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
Ниже представлена схема архитектуры прямой трансляции:
Нажмите конец:
+----------------+ +----------------+ +----------------+
| Модуль сбора данных | -> | кодированиеустройство | -> | Модуль передачи |
| (Аудио и видео подборка) | | (Аудио и видеокодирование) | | (Аудио и видеопередача) |
+----------------+ +----------------+ +----------------+
Серверная часть:
+----------------+ +----------------+ +----------------+
| балансировка нагрузки | -> | Перекодировать | -> | Записывать |
| (Прием и распределение потоков) | | (конвертировать формат кодирования) | | (Хранилище Аудио и видеоданные)|
+----------------+ +----------------+ +----------------+
Конец трансляции:
+----------------+ +----------------+ +----------------+
| декодер | -> | модуль рендеринга | -> | игрок |
| (Аудио и декодирование видео) | | (Аудио и видеорендеринг) | | (Аудио и видеоигра) |
+----------------+ +----------------+ +----------------+
Задержка прямой трансляции повлияет на удобство использования. Привлечение через оптимизацию、кодирование、передача инфекции、декодированиеждатьсвязь,Можно уменьшитьнизкая задержка, улучшение производительности в режиме реального времени. Стратегии оптимизации задержки прямой трансляции включают в себя:
В этой статье представлена вся картина технологии прямого вещания.,От коллекции аудио и видео в реальном времени до воспроизведения каждой ссылки.,Ниже приведена упрощенная блок-схема прямой трансляции:
+-------------+ +-------------+ +-------------+
| Модуль сбора данных | ---> | кодированиеустройство | ---> | Модуль передачи |
+-------------+ +-------------+ +-------------+
|
v
+-------------+
| сервер |
+-------------+
|
v
+-------------+ +-------------+ +-------------+
| декодер | ---> | модуль рендеринга | ---> | игрок |
+-------------+ +-------------+ +-------------+
Процесс прямой трансляции включает в себя следующие ключевые звенья:
существуют в практическом применении,Необходимо выбрать подходящую технологию и стратегию в соответствии с потребностями и сценариями.,для достижения высокого качества、низкая задержкаиз живого опыта.