mirror of
https://github.com/l1ving/youtube-dl
synced 2020-11-18 19:53:54 -08:00
[postprocessor/ffmpeg] simplify media info extraction using ffprobe
This commit is contained in:
parent
90f794c6c3
commit
ffbb5f0568
@ -4,6 +4,7 @@ import io
|
|||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
from .common import AudioConversionError, PostProcessor
|
from .common import AudioConversionError, PostProcessor
|
||||||
@ -164,6 +165,28 @@ class FFmpegPostProcessor(PostProcessor):
|
|||||||
# ffmpeg, see https://ffmpeg.org/trac/ffmpeg/ticket/2127 for details)
|
# ffmpeg, see https://ffmpeg.org/trac/ffmpeg/ticket/2127 for details)
|
||||||
return 'file:' + fn
|
return 'file:' + fn
|
||||||
|
|
||||||
|
def probe(self, path, info_type):
|
||||||
|
if not self.probe_available:
|
||||||
|
raise PostProcessingError('ffprobe or avprobe not found. Please install one.')
|
||||||
|
try:
|
||||||
|
cmd = [
|
||||||
|
encodeFilename(self.probe_executable, True),
|
||||||
|
encodeArgument('-loglevel'),
|
||||||
|
encodeArgument('error'),
|
||||||
|
encodeArgument('-print_format'),
|
||||||
|
encodeArgument('json'),
|
||||||
|
encodeArgument('-show_%s' % info_type),
|
||||||
|
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:
|
||||||
|
return None
|
||||||
|
return json.loads(output)[info_type]
|
||||||
|
except (IOError, OSError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class FFmpegExtractAudioPP(FFmpegPostProcessor):
|
class FFmpegExtractAudioPP(FFmpegPostProcessor):
|
||||||
def __init__(self, downloader=None, preferredcodec=None, preferredquality=None, nopostoverwrites=False):
|
def __init__(self, downloader=None, preferredcodec=None, preferredquality=None, nopostoverwrites=False):
|
||||||
@ -175,28 +198,11 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
|
|||||||
self._nopostoverwrites = nopostoverwrites
|
self._nopostoverwrites = nopostoverwrites
|
||||||
|
|
||||||
def get_audio_codec(self, path):
|
def get_audio_codec(self, path):
|
||||||
|
streams = self.probe(path, 'streams')
|
||||||
if not self.probe_available:
|
if streams:
|
||||||
raise PostProcessingError('ffprobe or avprobe not found. Please install one.')
|
for stream in streams:
|
||||||
try:
|
if stream.get('codec_type') == 'audio':
|
||||||
cmd = [
|
return stream.get('codec_name')
|
||||||
encodeFilename(self.probe_executable, True),
|
|
||||||
encodeArgument('-show_streams'),
|
|
||||||
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:
|
|
||||||
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
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def run_ffmpeg(self, path, out_path, codec, more_opts):
|
def run_ffmpeg(self, path, out_path, codec, more_opts):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user