简体   繁体   English

ffmpeg comman可以使用subprocess.call()或os.system()在cmd中工作,但不能在Python中工作

[英]A ffmpeg comman canwork in cmd but not in Python using subprocess.call() or os.system()

I wanna transfer a .mp3 to .wav. 我想将.mp3传输到.wav。 This is my command: 这是我的命令:
ffmpeg -i a.mp3 -ar 16000 -ac 1 -acodec pcm_s16le a.wav

It worked well in cmd 在cmd中效果很好

C:\Users\starrysky\Documents\GitHub\bing_pic\html>ffmpeg -i a.mp3 -ar 16000 -ac 1 -acodec pcm_s16le a.wav
ffmpeg version N-86482-gbc40674 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.1.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib
  libavutil      55. 66.100 / 55. 66.100
  libavcodec     57. 99.100 / 57. 99.100
  libavformat    57. 73.100 / 57. 73.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 92.100 /  6. 92.100
  libswscale      4.  7.101 /  4.  7.101
  libswresample   2.  8.100 /  2.  8.100
  libpostproc    54.  6.100 / 54.  6.100
Input #0, mp3, from 'a.mp3':
  Metadata:
    encoder         : Lavf54.6.100
  Duration: 00:00:01.87, start: 0.000000, bitrate: 8 kb/s
    Stream #0:0: Audio: mp3, 8000 Hz, mono, s16p, 8 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, wav, to 'a.wav':
  Metadata:
    ISFT            : Lavf57.73.100
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s
    Metadata:
      encoder         : Lavc57.99.100 pcm_s16le
size=      59kB time=00:00:01.87 bitrate= 256.3kbits/s speed= 187x
video:0kB audio:58kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.130208%

but when I moved it into my python program, something strange happened. 但是当我将其移入python程序时,发生了一些奇怪的事情。

>>> C:\Users\starrysky\Documents\GitHub\bing_pic\html\
'ffmpeg' �����ڲ����ⲿ���Ҳ���ǿ����еij���
���������ļ���
1 Command 'ffmpeg -i a.mp3 -ar 16000 -ac 1 -acodec pcm_s16le a.wav' returned non-zero exit status 1.
文件错误啊,亲
[WinError 2] 系统找不到指定的文件。: 'a.wav'

This is part of my python code: 这是我的python代码的一部分:

@bot.register(wife, RECORDING)
def translate_sound(msg):
    msg.get_file(save_path='a.mp3')
    path = os.path.abspath('.')+'\\'
    print(path)
    try:
        subprocess.check_call('ffmpeg -i a.mp3 -ar 16000 -ac 1 -acodec pcm_s16le a.wav', shell=True)
        # ''
    except Exception as e:
        print(1, e)
    wav_to_text('a.wav')
    try:
        os.remove('a.wav')
    except Exception as e:
        print(e)

# 调用百度语音识别API
def get_token():
    URL = 'http://openapi.baidu.com/oauth/2.0/token'
    _params = urllib.parse.urlencode({'grant_type': b'client_credentials',
                                      'client_id': b'<client_id>'
                                      'client_secret': b'<client_secret>'})
    _res = urllib.request.Request(URL, _params.encode())
    _response = urllib.request.urlopen(_res)
    _data = _response.read()
    _data = json.loads(_data)
    return _data['access_token']


def wav_to_text(wav_file):
    try:
        wav_file = open(wav_file, 'rb')
    except IOError:
        print('文件错误啊,亲')
        return
    wav_file = wave.open(wav_file)
    n_frames = wav_file.getnframes()
    print('n_frames ', n_frames)
    frame_rate = wav_file.getframerate()
    print("frame_rate ", frame_rate)
    if n_frames == 1 or frame_rate not in (8000, 16000):
        print('不符合格式')
        return
    audio = wav_file.readframes(n_frames)
    seconds = n_frames/frame_rate+1
    minute = int(seconds/60 + 1)
    for i in range(0, minute):
        sub_audio = audio[i*60*frame_rate:(i+1)*60*frame_rate]
        base_data = base64.b64encode(sub_audio)
        data = {"format": "wav",
                "token": get_token(),
                "len": len(sub_audio),
                "rate": frame_rate,
                "speech": base_data.decode(),
                "cuid": "B8-AC-6F-2D-7A-94",
                "channel": 1}
        data = json.dumps(data)
        res = urllib.request.Request('http://vop.baidu.com/server_api',
                              data.encode(),
                              {'content-type': 'application/json'})
        response = urllib.request.urlopen(res)
        res_data = json.loads(response.read())
        try:
            print(res_data['result'][0])
        except Exception as e:
            print(e)

What happened? 发生了什么?

In pycharm:the command you should edit full path: 在pycharm中:该命令应编辑完整路径:

ubprocess.check_call('D:/ffmpeg/bin/ffmpeg -i a.mp3 -ar 16000 -ac 1 -acodec pcm_s16le a.wav', shell=True). ubprocess.check_call('D:/ ffmpeg / bin / ffmpeg -i a.mp3 -ar 16000 -ac 1 -acodec pcm_s16le a.wav',shell = True)。

D:/ffmpeg/bin` is my install path. D:/ ffmpeg / bin是我的安装路径。 You need to change it to your full path. 您需要将其更改为完整路径。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM