Configuración de codificación 3gp de YouTube

Estoy creando un nuevo sitio de medios y estoy siguiendo las indicaciones de YouTube sobre qué formatos de archivo de video debo ofrecer para una usabilidad generalizada entre los clientes móviles y de escritorio. Estoy haciendo toda la transcodificación usando ffmpeg. Mi problema es que los archivos .3gp de YouTube tienen una ID de códec de "3gp6", un formato de video de "MPEG-4 Visual" y un perfil de formato de video de "Simple@L1" (usando mediainfopara interrogar los archivos). No puedo. No descubro qué ffmpegconfiguraciones puedo usar para reproducir esto.

Si lo uso -vcodec libx264 -profile:v baseline -level 1en mi ffmpegcomando, el archivo sale con la ID de códec correcta, pero el formato de video es "AVC" y el perfil es "Baseline@L1.0".

Alternativamente, si uso -vcodec mpeg4 -profile 0 -level 1, entonces el formato de video y el perfil son correctos, pero la ID del códec es "3gp4" en lugar de "3gp6".

Entonces, mi pregunta es, ¿cómo puedo ffmpegllegar a un ID de códec de 3gp6 junto con un formato de MPEG-4 Visual y un perfil de Simple@L1? He estado buscando en Google sin éxito y experimentando con esto durante horas.

Respuestas (2)

Para empezar, ¿por qué querrías tus videos en el contenedor .3gp? Es un formato muy irrelevante hoy en día, prácticamente no hay ningún dispositivo que soporte el contenedor 3gp pero no MP4 al mismo tiempo. No es más que un derivado cercano de MP4, son formatos de contenedor muy similares que tienen el mismo códec. Si desea admitir una gran cantidad de dispositivos que utilizan h264 en el contenedor mp4, abra su sitio web a la mayoría de los dispositivos móviles y de escritorio, además, vp8/webm ofrece compatibilidad con el software de código abierto que no puede pagar la licencia h264 o no. quiero usar h264. Con estos dos formatos, cubre todos los mercados relevantes.

http://caniuse.com/#feat=mpeg4

http://caniuse.com/#feat=webm

3gp es un formato obsoleto para teléfonos heredados, mucho antes de la era de Android e iOS cuando YouTube era nuevo y comenzó a agregar un poco de soporte móvil y es casi idéntico a MP4, algunos fabricantes incluso nombran sus archivos 3gp con la extensión .mp4 ( wiki )

También tenga en cuenta que tener sus archivos con la misma metainformación que los de YouTube no es un indicador de si son compatibles o no, YouTube usa un codificador diferente al suyo y el codificador escribirá información diferente a x264 en ffmpeg. Si su archivo cumple con las especificaciones de un determinado formato que es compatible, así de fácil. Si quiere estar seguro de que no utiliza ninguna función de formato elegante, simplemente use un perfil bajo (por ejemplo, línea de base en el caso de h264) para garantizar la compatibilidad con prácticamente cualquier dispositivo, cuanto más bajo sea el perfil, menos funciones se permiten.

Si REALMENTE necesita usar 3gp, puede especificar el contenedor con la opción -f 3gp. Usar el perfil BaseLine 1 es absolutamente suficiente. El uso de una línea de comando ffmpeg como la siguiente le dará lo que necesita:

ffmpeg -i input.mp4 -vf scale=320:240 -vcodec mpeg4 -acodec aac -strict -2 -f
3gp output.3gp

Tenga en cuenta el uso de mpeg4en lugar de libx264. El mpeg4codificador es el códec Mpeg4 Parte 2, también conocido como h263. Nuevamente, muy pocos dispositivos hoy en día no son compatibles con h264 y solo puedo recomendar que admitan h263 en el contenedor 3gp cuando tenga una necesidad imperiosa de hacerlo o tenga una base de usuarios extremadamente grande que se ubique en las decenas de millones de usuarios.

Tener 3gp6 en lugar de 3gp4 es irrelevante, está apuntando a dispositivos antiguos, por lo que usar la versión más nueva del estándar no tiene mucho sentido. FFmpeg usará el contenedor 3gp6 solo cuando use el códec h264 también más nuevo, para el que también está destinada la versión 6.

Aquí y un extracto del estándar 3gpp v6:

Specific MBMS Rel-6 application codecs are introduced, like for example audio codecs Extended AMR-WB (AMR-WB+), Enhanced aacPlus and video codec H.264/AVC.

Entonces, a menos que use h264, no es necesario usar la Versión 6 y puede seguir con la Versión 4 sin tener ningún problema. Lo contrario es en realidad el caso, cuanto más antigua sea la versión, más dispositivos antiguos admitirá.

No estoy seguro de por qué YouTube todavía ofrece formatos 3GP, pero dado que todavía lo hacen a finales de 2014, supongo que es por una buena razón. Su objetivo no es solo EE. UU., donde abundan los teléfonos inteligentes. También apuntan a cualquier otro lugar, como países del tercer mundo donde los teléfonos supuestamente "tontos" ofrecen todo el Internet que la gente puede obtener. Tal vez este sea el propósito de YouTube al seguir ofreciendo 3GP. Mi sitio también se dirige a la audiencia mundial. Y no solo estoy haciendo 3GP. También estoy haciendo MP3, WEBM y FLV como lo hace YouTube. Es solo la parte de 3GP en la que estoy atascado.
La única razón es que para los teléfonos realmente antiguos, solo tienen que remuxar sus codificaciones mp4 para que no sea un trabajo adicional, no se sorprendería si no solo cambian algunos bytes en el encabezado. Hay un porcentaje muy pequeño de teléfonos que admiten 3gp pero no mp4. ¿Cuál es la razón de esa gran compatibilidad? ¿Su audiencia consiste principalmente en usuarios de dispositivos heredados?
Es en nombre de llegar a la audiencia más amplia posible. Pero reconozco que alcanzar el último X por ciento puede requerir demasiado esfuerzo. Aún así, si hay una manera "fácil" de obligar a ffmpeg a que me proporcione archivos 3gp6 usando MPEG-4 Visual y Simple@L1, me gustaría probarla.
Agregué información sobre cómo codificar tus videos de esa manera, pero nuevamente, definitivamente deberías ver si eso realmente vale la pena. Es como hacer optimizaciones para IE6 y 7.
Otra edición con respecto a 3gpp v6 vs v4

Pregunté en la lista de correo de usuarios de ffmpeg y me sugirieron que agregara -brand 3gp6mi comando de codificación. Esto logró el resultado mediainfoque estaba buscando. Sin embargo, queda por ver si esto realmente alcanza la misma compatibilidad con hardware antiguo que tienen los archivos 3GP de YouTube. No tengo ningún hardware viejo para probar, lol. De todos modos, en lo que a mí respecta, ¡problema resuelto por ahora!

Si alguien está interesado, aquí está el comando con el que terminé para reproducir el "Formato 36" de YouTube, que es un video 3GP de 360x180 con una tasa de bits general de aproximadamente 230 Kbps:

ffmpeg -i input-file.mov -vcodec mpeg4 -s 320x180 -qscale:v 20 -brand 3gp6 \
    -vf 'scale=iw*sar:ih,pad=max(iw\,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2' \
    -acodec libfaac -ar 22050 -ac 1 -qscale:a 70 output-file.3gp

Y esto es lo que se me ocurrió para reproducir su "Formato 17", que es un video 3GP de 176x144 con una tasa de bits general de aproximadamente 82 Kbps:

ffmpeg -i input-file.mov -vcodec mpeg4 -s 176x144 -qscale:v 12 -r 10 -level 8 -brand 3gp6 \
    -vf 'scale=iw*sar:ih,pad=max(iw\,ih*(11/9)):ow/(11/9):(ow-iw)/2:(oh-ih)/2' \
    acodec libfaac -ar 22050 -ac 1 -qscale:a 45 output-file.3gp

En caso de que te lo estés preguntando, ese argumento masivo "-vf" detecta automáticamente desajustes en las relaciones de aspecto entre la entrada y la salida, y enmarca la salida si difieren.