Приложение для зеркалирования экрана Android, только локальный Wi-FiAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Приложение для зеркалирования экрана Android, только локальный Wi-Fi

Сообщение Anonymous »

Я хочу создать приложение для Android, совместно использовать экран между устройством Android и телевизором Android, мне нужна только локальная сеть Wi-Fi, я уже создал два клиента, один для телефона, другой для телевизора, клиент телевизора показывает QR-код с IP-адресом и информация о порте, телефонный клиент сначала сканирует QR-код, затем делает снимок экрана, отправляет данные ТВ-клиенту по UDP, но эффект очень плохой, изображение нечеткое и не плавное

Я использую следить за уроками
  • MediaCodec и MediaProjection для захвата экрана
  • DatagramSocket для отправки данных ByteArray
У меня мало знаний о UDP

Хочу задать несколько вопросов
  • Как сделать эффект более плавным и ясно
  • Если у меня есть другие варианты достижения функции, которую я например, хочу ли я использовать какую-нибудь библиотеку с открытым исходным кодом или какие-либо другие решения?
Спасибо.
Я уже написал два клиента

отправки данных
fun sendCaptureData(data: ByteArray) {
if (tvInfo == null) {
Logger.e("TV info is null")
return
}
job.launch {
try {
val chunks = splitCaptureData(data)
for (chunk in chunks) {
val datagramPacket = datagramPacketPool.borrow()
datagramPacket.data = chunk
datagramPacket.length = chunk.size
datagramPacket.address = InetAddress.getByName(tvInfo!!.ip)
datagramPacket.port = tvInfo!!.port
datagramSocket.send(datagramPacket)
datagramPacketPool.release(datagramPacket)
}
} catch (e: Exception) {
Logger.e(e, "Error sending data")
}
}
}

получить данные
fun startReceiving(dataDecoder: DataDecoder) {
isReceiving = true
// 启动接收协程
job.launch {
while (isReceiving) {
try {
datagramSocket.receive(packet)
val receivedData = ByteArray(packet.length)
System.arraycopy(packet.data, packet.offset, receivedData, 0, packet.length)
dataDecoder.decode(receivedData)
} catch (e: Exception) {
Logger.e(e, "Error receiving data")
}
}
}
}

декодировать данные
fun decode(receivedData: ByteArray) {
if (mediaCodec == null) return
val index = mediaCodec!!.dequeueInputBuffer(10000)
if (index >= 0) {
val inputBuffer = mediaCodec!!.getInputBuffer(index)
inputBuffer?.clear()
inputBuffer?.put(receivedData, 0, receivedData.size)
mediaCodec!!.queueInputBuffer(index, 0, receivedData.size, 0, 0)
val bufferInfo = MediaCodec.BufferInfo()
var outputBufferIndex = mediaCodec!!.dequeueOutputBuffer(bufferInfo, 0)
while (outputBufferIndex >= 0) {
mediaCodec!!.releaseOutputBuffer(outputBufferIndex, true)
outputBufferIndex = mediaCodec!!.dequeueOutputBuffer(bufferInfo, 0)
}
Logger.i("MediaCodec decoded")
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -wifi-only
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»