audio - reproducir - insertar video en html5
Averiguar si el archivo de video tiene audio presente (5)
Esta pregunta ya tiene una respuesta aquí:
- Usando ffprobe para verificar archivos de solo audio 4 respuestas
Estoy tratando de averiguar si un video tiene audio presente para extraer el mp3 usando ffmpeg. Cuando el video no contiene canales de audio, ffmpeg crea un archivo mp3 vacío que estoy usando para averiguar si el audio estaba presente en el video en primer lugar. Estoy seguro de que hay una mejor manera de identificar si el audio está presente en un video. ¿Ayudará avprobe con esto? ¿Alguien puede indicarme un recurso o probablemente una solución?
Edición: Sorprendentemente, el mismo comando en mi servidor que ejecuta la última compilación de ffprobe no se ejecuta. Lanza un error diciendo
Opción no reconocida ''select_stream''
Error al establecer el valor ''a'' para la opción ''select_stream''
¿Alguna idea de cómo rectificar esto?
Encontré una ronda por resolver este problema. Esto parece responder a la pregunta que hice.
ffprobe -i input.mp4 -show_streams 2>&1 | grep ''Stream #0:1''
Si es un archivo de video normal de la ruta local, puede hacer algo como esto para saber si el video tiene un archivo de audio o no.
Necesitas mirar en el MediaMetadataRetriever
Al usar METADATA_KEY_HAS_AUDIO
puede verificar si el video tiene el audio o no.
private boolean isVideoHaveAudioTrack(String path) {
boolean audioTrack =false;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(path);
String hasAudioStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
if(hasAudioStr.equals("yes")){
audioTrack=true; }
else{
audioTrack=false; }
return audioTrack;
}
Aquí la ruta es la ruta del archivo de vídeo.
PD: Ya que es una pregunta antigua, escribo esta respuesta para ayudar a otras personas, a las que puede ayudar.
Si solo quiere saber si hay audio y no le importan los detalles de la transmisión, puede ejecutar el siguiente comando, que extraerá la duración de la transmisión de audio en el archivo de entrada. Si la respuesta es nula / espacio en blanco, el archivo de entrada no contiene audio.
Mando:
ffprobe -v error -of flat=s_ -select_streams 1 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1
Yo usaría FFprobe (viene junto con FFMPEG):
ffprobe -i INPUT -show_streams -select_streams a -loglevel error
En caso de que no haya audio no sale nada. Si hay una transmisión de audio, entonces obtienes algo como:
[CORRIENTE]
índice = 0
codec_name = mp3
codec_long_name = MP3 (capa de audio MPEG 3)
perfil = desconocido
codec_type = audio
codec_time_base = 1/44100
etc
etc ...
[/CORRIENTE]
Eso debería ser lo suficientemente fácil de analizar, independientemente del idioma que esté utilizando para automatizar este proceso.
ffprobe -v fatal # set log level to fatal
-of default=nw=1:nk=1 # use default format and hide wrappers and keys
-show_streams # show info about media streams
-select_streams a # show only audio streams
-show_entries stream=codec_type # show only stream.codec_type entries
video.mp4 # input file
Un archivo multimedia contiene una secuencia de audio que devuelve:
audio
1
0
0
0
0
0
0
0
0
0
0
0
und
SoundHandler
Un archivo multimedia no contiene ninguna secuencia de audio que devuelva el resultado vacío.
Un archivo no multimedia también devuelve un resultado vacío. Si desea devolver un mensaje de error para archivos no multimedia y en cualquier otro caso de error, use el -v error
lugar:
ffprobe -v error # set log level to error
-of default=nw=1:nk=1 # use default format and hide wrappers and keys
-show_streams # show info about media streams
-select_streams a # show only audio streams
-show_entries stream=codec_type # show only stream.codec_type entries
video.mp4 # input file
Entonces, tomas esto en lugar de un resultado vacío:
non-media-file.zip: Invalid data found when processing input