Transcoding es el proceso de convertir un archivo multimedia digital de un formato de compresión a otro mediante una decodificación completa y una recodificación posterior. A diferencia de la transmuxing (cambio solo del contenedor), el transcoding modifica el códec, la tasa de bits, la resolución y otros parámetros del flujo comprimido. Según Apple AVFoundation documentation (2026), el transcoding se utiliza para adaptar el contenido a diferentes dispositivos y condiciones de red.
Puntos Clave
Transcoding es el proceso de convertir un archivo multimedia de un formato de compresión a otro mediante la decodificación completa del flujo de origen en un formato PCM intermedio sin comprimir y la posterior codificación con nuevos parámetros. Si el archivo de origen utiliza el códec H.264 con una tasa de bits de 10 Mbps y la salida necesita H.265 con una tasa de bits de 3 Mbps — eso es transcoding.
El transcoding se diferencia del simple reempaquetado (transmuxing), donde solo cambia el contenedor (por ejemplo, MP4 a MKV) mientras que el flujo de bits comprimido permanece sin cambios. El transcoding implica operaciones computacionalmente costosas: decodificación de cada fotograma, aplicación de filtros (escalado, corrección de color, recorte) y recodificación con nuevos parámetros. Esto hace que el transcoding sea una de las operaciones que más recursos consume al trabajar con multimedia.
El transcoding se utiliza en una amplia gama de tareas: adaptación de video a las limitaciones de ancho de banda, conversión a un formato con soporte de decodificación por hardware en el dispositivo de destino, creación de múltiples versiones para transmisión HLS/DASH, extracción de pistas de audio en un archivo separado. Los servicios OTT (Netflix, YouTube, Twitch) transcodifican cada archivo subido en docenas de variantes con diferentes tasas de bits, resoluciones y códecs para proporcionar transmisión adaptativa a millones de usuarios.
El proceso de transcoding consta de tres etapas principales: decodificación, procesamiento y codificación. Cada etapa puede realizarse en CPU o en bloques de GPU/hardware dependiendo de la disponibilidad y el rendimiento requerido.
La primera etapa es la decodificación del flujo de origen. El archivo de origen se lee del contenedor (MP4, MOV, MKV), después de lo cual los paquetes de video comprimidos se envían al decodificador. La decodificación puede ser por hardware (si el códec es compatible) o por software a través de FFmpeg. La salida de la decodificación son fotogramas sin comprimir en formato YUV420 o BGRA — esta es la etapa donde el transcoding se diferencia del simple remultiplexado.
La segunda etapa es el filtrado y procesamiento. Los fotogramas decodificados pasan a través de una cadena de filtros: escalado a la resolución objetivo, cambio de la tasa de fotogramas, corrección de color, superposición de texto o gráficos. La cadena de filtros de FFmpeg se construye como un grafo donde cada filtro es un módulo de procesamiento separado. Por ejemplo, el filtro scale=1280:720 cambia la resolución, fps=30 cambia la tasa de fotogramas y yadif realiza el desentrelazado. Todas las operaciones se realizan sobre fotogramas sin comprimir, lo que hace que la segunda etapa sea la que más recursos consume.
La tercera etapa es la codificación en el formato de destino. Los fotogramas procesados se introducen en el codificador, que los comprime según el algoritmo del códec objetivo. El codificador puede ser por hardware (VideoToolbox en iOS, MediaCodec en Android) o por software (libx264, libx265). Parámetros de codificación: CRF (Constant Rate Factor) para calidad constante, tasa de bits para CBR/VBR, perfil y nivel para compatibilidad con los dispositivos de destino.
// Diagrama del pipeline de transcodificación con FFmpeg
AVFormatContext *inputCtx, *outputCtx;
AVCodecContext *decoderCtx, *encoderCtx;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
while (av_read_frame(inputCtx, &packet) >= 0) {
// 1. Decodificar
avcodec_send_packet(decoderCtx, &packet);
avcodec_receive_frame(decoderCtx, frame);
// 2. Filtrar (escalado + cambio de fps)
sws_scale(swsCtx, frame->data, frame->linesize,
0, frame->height, scaledFrame->data,
scaledFrame->linesize);
// 3. Codificar
avcodec_send_frame(encoderCtx, scaledFrame);
avcodec_receive_packet(encoderCtx, &outPacket);
av_interleaved_write_frame(outputCtx, &outPacket);
}
El pipeline anterior demuestra el ciclo clásico de transcoding. La función av_read_frame lee paquetes comprimidos del archivo de entrada, avcodec_send_packet los decodifica en fotogramas, sws_scale realiza el escalado y avcodec_send_frame codifica el fotograma procesado en el formato de salida. Este ciclo de tres etapas se repite para cada fotograma o grupo de fotogramas (GOP), dependiendo de la configuración del codificador.
La diferencia entre transcoding y transmuxing es uno de los puntos de confusión más comunes en la ingeniería multimedia. Comprender esta diferencia es fundamental para elegir la estrategia correcta de procesamiento multimedia.
| Parámetro | Transcoding | Transmuxing |
|---|---|---|
| Qué cambia | Códec, tasa de bits, resolución | Contenedor, metadatos |
| Carga computacional | Alta (decodificación + codificación) | Mínima (copia de paquetes) |
| Calidad | Puede degradarse (pérdida de generación) | Sin pérdidas |
| Tiempo de ejecución | Minutos–horas para video largo | Segundos–minutos |
| Aplicación | Adaptación de formato, compresión | Cambio de contenedor por compatibilidad |
Transmuxing es el reempaquetado de un flujo comprimido en un contenedor diferente sin decodificación y recodificación. Si el video ya está comprimido con el códec H.265 en un contenedor MP4 y necesita colocarse en un contenedor MOV o MKV — la transmuxing simplemente copia los paquetes de bits de un contenedor a otro. La calidad no se ve afectada, el tiempo de procesamiento es mínimo ya que no se requiere decodificación de fotogramas. FFmpeg realiza la transmuxing con el flag -codec copy.
Transcoding, por otro lado, decodifica y re-comprime completamente el flujo multimedia. Cada vez que un video pasa por transcoding, puede ocurrir una pérdida de generación (generation loss) — una ligera degradación de la calidad debido a la compresión con pérdidas repetida. Incluso con la misma tasa de bits, la tercera generación de transcoding suele ser peor que la primera. Es por esto que los profesionales recomiendan almacenar las copias maestras en formatos sin comprimir o mínimamente comprimidos (ProRes, DNxHR) y transcodificar solo las versiones finales para distribución.
La elección de la herramienta de transcoding depende de la plataforma, los requisitos de rendimiento y el caso de uso. Para el desarrollo móvil, están disponibles tanto las API nativas como las bibliotecas multiplataforma.
FFmpeg es el estándar de facto para transcoding en todas las plataformas. La línea de comandos de FFmpeg permite realizar prácticamente cualquier conversión: cambio de códec, ajuste de tasa de bits, recorte, concatenación, aplicación de filtros. Para aplicaciones móviles, FFmpeg se integra a través de las bibliotecas libavformat, libavcodec y libavfilter. Ejemplo de un comando típico de transcoding: ffmpeg -i input.mp4 -c:v libx265 -crf 23 -c:a aac -b:a 128k output.mp4.
En iOS, el transcoding se realiza a través de AVAssetWriter y AVAssetReader. AVAssetReader decodifica el archivo de origen leyendo fotogramas sin comprimir, y AVAssetWriter los codifica en el formato de destino. Este enfoque utiliza automáticamente los codificadores de hardware VideoToolbox, garantizando el máximo rendimiento. En Android, la funcionalidad similar está disponible a través de MediaCodec junto con MediaExtractor y MediaMuxer — MediaExtractor extrae paquetes comprimidos, MediaCodec decodifica y codifica, MediaMuxer escribe el resultado.
Para el transcoding del lado del servidor en entornos de producción, se utilizan servicios en la nube: AWS Elemental MediaConvert, Azure Media Services, Google Transcoder API. Estos servicios se escalan automáticamente bajo carga, admiten todos los formatos populares y pueden transcodificar un solo archivo de entrada en docenas de variantes de salida para transmisión adaptativa (HLS, DASH). Para aplicaciones móviles, el transcoding en la nube es la solución óptima ya que no carga el dispositivo del usuario y permite la preparación asíncrona de contenido.
Examinemos ejemplos prácticos de transcoding en plataformas móviles utilizando aceleración por hardware y configuración de parámetros clave de calidad.
import AVFoundation
func transcodeVideo(sourceURL: URL, destURL: URL) {
let asset = AVAsset(url: sourceURL)
let preset = AVAssetExportPresetHEVCHighestQuality
AVAssetExportSession(asset: asset, presetName: preset)?
.exportAsynchronously {
switch assetExportSession?.status {
case .completed:
print("Transcodificación finalizada")
case .failed:
print("Error: " + assetExportSession.error.localizedDescription)
default:
break
}
}
// Transcodificación manual con AVAssetReader + AVAssetWriter
let reader = try AVAssetReader(asset: asset)
let writer = try AVAssetWriter(url: destURL,
fileType: .mp4)
let outputSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.hevc,
AVVideoWidthKey: 1920,
AVVideoHeightKey: 1080,
AVVideoCompressionPropertiesKey: [
AVVideoAverageBitRateKey: 4_000_000,
AVVideoProfileLevelKey: AVVideoProfileLevelH265Main10
]
]
let adaptor = AVAssetWriterInput(
mediaType: .video,
outputSettings: outputSettings
)
writer.add(adaptor)
}
El ejemplo muestra dos enfoques para el transcoding en iOS. AVAssetExportSession es una forma sencilla con ajustes preestablecidos de calidad (HEVCHighestQuality para H.265). El pipeline manual a través de AVAssetReader + AVAssetWriter proporciona control total sobre los parámetros: tasa de bits, perfil, nivel. El parámetro AVVideoProfileLevelH265Main10 habilita el perfil HDR Main10 con profundidad de color de 10 bits, lo cual es importante para el contenido HDR moderno.
class Transcoder(private val context: Context) {
fun transcodeToHevc(inputUri: Uri, outputFile: File) {
val extractor = MediaExtractor()
extractor.setDataSource(context, inputUri, null)
val trackFormat = extractor.getTrackFormat(videoTrackIndex)
val mime = trackFormat.getString(MediaFormat.KEY_MIME)
val decoder = MediaCodec.createDecoderByType(mime!!)
val encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC)
val outputFormat = MediaFormat.createVideoFormat(
MediaFormat.MIMETYPE_VIDEO_HEVC, 1920, 1080
).apply {
setInteger(MediaFormat.KEY_BIT_RATE, 4_000_000)
setInteger(MediaFormat.KEY_FRAME_RATE, 30)
setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2)
}
encoder.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
encoder.start()
}
}
El código de Android crea un pipeline de MediaExtractor — decodificador MediaCodec — codificador MediaCodec — MediaMuxer. MediaExtractor determina el tipo de códec del archivo de entrada y selecciona el decodificador correspondiente. El codificador se configura para H.265 (HEVC) con una tasa de bits de 4 Mbps y un intervalo de fotogramas clave de 2 segundos, lo cual es óptimo para transmisión. Importante: el codificador MediaCodec funciona de forma síncrona, por lo que para transcoding en tiempo real se debe implementar un bucle con manejo correcto de marcas de tiempo (PTS) para cada fotograma.
El transcoding en dispositivos móviles es una tarea que requiere una optimización cuidadosa debido a los recursos limitados de CPU, GPU y las restricciones térmicas. Varias estrategias ayudan a realizar el transcoding de manera eficiente.
El factor clave de rendimiento es el codificador por hardware. En iOS, VideoToolbox proporciona codificación por hardware de H.264 y H.265 a velocidades 5–10 veces más rápidas que libx264 por software. En Android, MediaCodec utiliza componentes OMX de hardware si están disponibles. Habilitar la codificación por hardware reduce el tiempo de transcoding de un video de 10 minutos de 30–40 minutos (software) a 3–5 minutos (hardware) en un dispositivo insignia.
Para el transcoding móvil, el equilibrio entre calidad, tamaño y tiempo de procesamiento es crítico. Para H.265 en dispositivos móviles, se recomienda una tasa de bits de 4–8 Mbps para video 1080p a 30 FPS. El modo CRF (Constant Rate Factor) en libx265 permite establecer la calidad directamente, donde 23–28 proporciona buena calidad visual con un tamaño de archivo moderado. Para codificadores por hardware, use el modo CBR con una tasa de bits objetivo ya que CRF no es compatible con hardware.
El transcoding continuo en un dispositivo móvil provoca un calentamiento significativo. Después de 5–7 minutos de codificación intensiva de video 4K, la temperatura del procesador puede alcanzar 50–55 grados, después de lo cual se activa el estrangulamiento térmico. La solución es transcodificar con pausas o reducir la tasa de fotogramas a 30 FPS. Si la aplicación requiere transcoding por lotes (por ejemplo, un editor de video), es mejor procesar en lotes de 2–3 minutos con intervalos de enfriamiento. Para escenarios de producción, lo óptimo es trasladar el transcoding al lado del servidor y utilizar servicios en la nube.
Preguntas Frecuentes
La codificación (encoding) es la compresión de datos sin comprimir en un códec de destino. El transcoding incluye tanto la decodificación como la codificación: primero decodifica un flujo comprimido existente, luego lo codifica de nuevo. La codificación simple toma datos sin comprimir como entrada (por ejemplo, de una cámara), mientras que el transcoding toma un archivo ya comprimido.
Para máxima compatibilidad — H.264. Para mejor compresión — H.265 (HEVC). Si el dispositivo admite codificación por hardware H.265 (iPhone 8+, Android con Snapdragon 845+), proporciona la mitad del tamaño de archivo con la misma calidad. La codificación AV1 en dispositivos móviles sigue siendo demasiado lenta incluso con aceleración por hardware.
Estrictamente hablando, el transcoding sin pérdidas es imposible al cambiar entre códecs con pérdidas. Si ambos códecs tienen pérdidas, cada generación de transcoding degrada la calidad. El transcoding sin pérdidas solo es posible entre formatos sin pérdidas (FFV1, H.264 Lossless) o al cambiar de contenedor sin recodificar (transmuxing).
Sí, si se utilizan decodificador y codificador por hardware y la resolución de destino no supera 1080p. En dispositivos con VideoToolbox (iOS) o MediaCodec (Android), el transcoding en tiempo real de H.264→H.265 es posible con un retraso de 1–3 segundos. Para 4K en tiempo real, se requiere un SoC potente como Apple A17 Pro, Snapdragon 8 Gen 2 o superior.
El transcoding con pérdidas acumula artefactos de compresión. Si el archivo de origen ya estaba muy comprimido (tasa de bits de 2–3 Mbps para 1080p), la recompresión duplica las pérdidas. Se recomienda transcodificar solo desde copias maestras con alta tasa de bits (20+ Mbps) y usar CRF 18–23 para pérdidas mínimas.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también