[postprocessor/ffmpeg] fallback to ffmpeg/avconv for audio codec detection(closes #681)
This commit is contained in:
		
							parent
							
								
									118afcf52f
								
							
						
					
					
						commit
						eb35b163ad
					
				
					 1 changed files with 34 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -9,9 +9,6 @@ import re
 | 
			
		|||
 | 
			
		||||
from .common import AudioConversionError, PostProcessor
 | 
			
		||||
 | 
			
		||||
from ..compat import (
 | 
			
		||||
    compat_subprocess_get_DEVNULL,
 | 
			
		||||
)
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    encodeArgument,
 | 
			
		||||
    encodeFilename,
 | 
			
		||||
| 
						 | 
				
			
			@ -165,27 +162,45 @@ class FFmpegPostProcessor(PostProcessor):
 | 
			
		|||
        return self._paths[self.probe_basename]
 | 
			
		||||
 | 
			
		||||
    def get_audio_codec(self, path):
 | 
			
		||||
        if not self.probe_available:
 | 
			
		||||
            raise PostProcessingError('ffprobe or avprobe not found. Please install one.')
 | 
			
		||||
        if not self.probe_available and not self.available:
 | 
			
		||||
            raise PostProcessingError('ffprobe/avprobe and ffmpeg/avconv not found. Please install one.')
 | 
			
		||||
        try:
 | 
			
		||||
            cmd = [
 | 
			
		||||
                encodeFilename(self.probe_executable, True),
 | 
			
		||||
                encodeArgument('-show_streams'),
 | 
			
		||||
                encodeFilename(self._ffmpeg_filename_argument(path), True)]
 | 
			
		||||
            if self.probe_available:
 | 
			
		||||
                cmd = [
 | 
			
		||||
                    encodeFilename(self.probe_executable, True),
 | 
			
		||||
                    encodeArgument('-show_streams')]
 | 
			
		||||
            else:
 | 
			
		||||
                cmd = [
 | 
			
		||||
                    encodeFilename(self.executable, True),
 | 
			
		||||
                    encodeArgument('-i')]
 | 
			
		||||
            cmd.append(encodeFilename(self._ffmpeg_filename_argument(path), True))
 | 
			
		||||
            if self._downloader.params.get('verbose', False):
 | 
			
		||||
                self._downloader.to_screen('[debug] %s command line: %s' % (self.basename, shell_quote(cmd)))
 | 
			
		||||
            handle = subprocess.Popen(cmd, stderr=compat_subprocess_get_DEVNULL(), stdout=subprocess.PIPE, stdin=subprocess.PIPE)
 | 
			
		||||
            output = handle.communicate()[0]
 | 
			
		||||
            if handle.wait() != 0:
 | 
			
		||||
                self._downloader.to_screen(
 | 
			
		||||
                    '[debug] %s command line: %s' % (self.basename, shell_quote(cmd)))
 | 
			
		||||
            handle = subprocess.Popen(
 | 
			
		||||
                cmd, stderr=subprocess.PIPE,
 | 
			
		||||
                stdout=subprocess.PIPE, stdin=subprocess.PIPE)
 | 
			
		||||
            stdout_data, stderr_data = handle.communicate()
 | 
			
		||||
            expected_ret = 0 if self.probe_available else 1
 | 
			
		||||
            if handle.wait() != expected_ret:
 | 
			
		||||
                return None
 | 
			
		||||
        except (IOError, OSError):
 | 
			
		||||
            return None
 | 
			
		||||
        audio_codec = None
 | 
			
		||||
        for line in output.decode('ascii', 'ignore').split('\n'):
 | 
			
		||||
            if line.startswith('codec_name='):
 | 
			
		||||
                audio_codec = line.split('=')[1].strip()
 | 
			
		||||
            elif line.strip() == 'codec_type=audio' and audio_codec is not None:
 | 
			
		||||
                return audio_codec
 | 
			
		||||
        output = (stdout_data if self.probe_available else stderr_data).decode('ascii', 'ignore')
 | 
			
		||||
        if self.probe_available:
 | 
			
		||||
            audio_codec = None
 | 
			
		||||
            for line in output.split('\n'):
 | 
			
		||||
                if line.startswith('codec_name='):
 | 
			
		||||
                    audio_codec = line.split('=')[1].strip()
 | 
			
		||||
                elif line.strip() == 'codec_type=audio' and audio_codec is not None:
 | 
			
		||||
                    return audio_codec
 | 
			
		||||
        else:
 | 
			
		||||
            # Stream #FILE_INDEX:STREAM_INDEX[STREAM_ID](LANGUAGE): CODEC_TYPE: CODEC_NAME
 | 
			
		||||
            mobj = re.search(
 | 
			
		||||
                r'Stream\s*#\d+:\d+(?:\[0x[0-9a-f]+\])?(?:\([a-z]{3}\))?:\s*Audio:\s*([0-9a-z]+)',
 | 
			
		||||
                output)
 | 
			
		||||
            if mobj:
 | 
			
		||||
                return mobj.group(1)
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def run_ffmpeg_multiple_files(self, input_paths, out_path, opts):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue