FFmpeg в файле Python уже существует ошибка - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над проектом, использующим python (3.6) и Django (2.0), в котором я конвертирую видео в mp4, если оно в любом другом формате.

Вот мой код:

from views.py:

def generate_thumbnail(filename, thumb_name):
    print('func called')
    print(filename)
    video_input_path = os.path.join(filename)
    img_output_path = os.path.join(thumb_name)
    subprocess.call(['ffmpeg', '-i', video_input_path, '-ss', '00:00:00.000', 'vframes', '1', img_output_path])


def convert_to_mp4(video_name, only_name):
    os.popen(
        "ffmpeg -i '{input}' -ac 2 -b:v 2000k -c:a aac -c:v libx264 -b:a 160k -vprofile high -bf 0 -strict experimental -f mp4 '{output}.mp4'".format(
            input=video_name, output=only_name))
    return True


def perform_upload(video, thumbnail):
    print('vdieo name is: {}'.format(video))
    servise = discovery.build('storage', 'v1', credentials=credentials)
    bucket_name = 'test_bucket004'
    print('Uploading the video...')
    media = MediaFileUpload(video, chunksize=4149304, mimetype='video/mp4',
                            resumable=True)
    req = servise.objects().insert(
        bucket=bucket_name,
        name=str(video),
        media_body=media,
        body={"cacheControl": "public,max-age=31536000"},
        predefinedAcl='publicRead'
    )
    resp = None
    while resp is None:
        status, resp = req.next_chunk()
    print(resp)
    video_url = 'http://storage.googleapis.com/' + bucket_name + '/' + str(video)

    print('Uploading your thumbnail...')
    media = MediaFileUpload(thumbnail, chunksize=4149304, mimetype='image/jpeg',
                            resumable=True)
    req = servise.objects().insert(
        bucket=bucket_name,
        name=str(thumbnail),
        media_body=media,
        body={"cacheControl": "public,max-age=31536000"},
        predefinedAcl='publicRead'
    )
    resp = None
    while resp is None:
        status, resp = req.next_chunk()
    print(resp)
    thumb_url = 'https://storage.googleapis.com/' + bucket_name + '/' + str(thumbnail)

    return video_url, thumb_url


class VideoConverter(generics.ListCreateAPIView):
    def get(self, request, *args, **kwargs):
        return HttpResponse('Get request', status=200)

    def post(self, request, *args, **kwargs):
        serializer = VideoConverterSerializer(data=self.request.data)
        validation = serializer.is_valid()
        print(serializer.errors)
        if validation is True:
            url = request.POST.get('video_url')
            filename = url.split('/')
            filename = filename[-1]
            print(filename)
            ext = filename.split('.')
            print(ext[-1])
            only_name = ext[0]
            urllib.request.urlretrieve(url, filename)
            generate_thumbnail(filename, only_name + '_thumbnail.jpg')
            if ext == 'mp4':
                videourl, thumb_url = perform_upload(filename, only_name + '_thumbnail.jpg')
            else:
                conversion = convert_to_mp4(filename, only_name)
                if conversion is True:
                    videourl, thumb_url = perform_upload(only_name + '.mp4', only_name + '_thumbnail.jpg')

            return HttpResponse('Video url is: {}\n \nThumbnail url is: {}'.format(videourl, thumb_url))
        else:
            return HttpResponse('Not a valid request')

Но когда я передаю ему видео в формате Mp4, в консоли IDE выдается следующее сообщение об ошибке:

ffmpeg версия 4.0.2 Copyright (c) 2000-2018 разработчики FFmpeg, созданные с конфигурацией Apple LLVM версии 10.0.0 (clang-1000.10.43.1): --prefix = / usr / local / Cellar / ffmpeg / 4.0.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc = clang --host-cflags = --host-ldflags = --enable-gpl--enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma libavutil 56. 14.100 / 56. 14.100 libavcodec 58. 18.100 / 58. 18.100 libavformat 58. 12.100/ 58. 12.100 libavdevice 58. 3.100 / 58. 3.100 libavfilter 7. 16.100 / 7. 16.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 1.100 / 5.1.100 libswresample 3. 1.100 / 3. 1.100 libpostproc 55. 1.100 / 55. 1.100 Вход # 0, mov, mp4, m4a, 3gp, 3g2, mj2, из 'PHP_GCS.mp4': Метаданные: major_brand: mp42 minor_version: 1 compatibility_brands: 1mp41mp42isom creation_time: 2018-08-03T13: 08: 04.000000Z Длительность: 00: 01: 21.40, старт: 0,000000, битрейт: 1584 кбит / с Поток # 0: 0 (унция): Видео: h264 (основной) (avc1 / 0x31637661)), yuv420p, 1918x1078 [SAR 1: 1 DAR 137: 77], 1581 кбит / с, 30 кадров в секунду, 30 тбр, 600 тбн, 1200 тбк (по умолчанию) Метаданные: creation_time: 2018-08-03T13: 08: 04.000000Z handler_name: Core Media Video

Файл 'PHP_GCS.mp4' уже существует.Перезаписать?[y / N]

и останавливайте выполнение здесь, пока я не нажму кнопку ввода. Я действительно сбит с толку, почему это радует, потому что, когда видео уже mp4, я не использую ffmpegно только для уменьшенного изображения.

Что здесь может быть не так?

Заранее спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Я думаю, что вы что-то упустили в своем коде.

Обработчик поста в видео конвертере имеет следующий код:

        ext = filename.split('.')
        print(ext[-1])
        only_name = ext[0]
        urllib.request.urlretrieve(url, filename)
        generate_thumbnail(filename, only_name + '_thumbnail.jpg')
        if ext == 'mp4': # mistake here

, но вы не проверяете правильную часть в своем утверждении if.

Вы должны написать if ext[-1] == 'mp4', потому что сейчас вы сравниваете список со строкой, которая всегда будет возвращать false!

Это может решить вашу проблему, и если нет, пожалуйста, дайте мне знать иЯ обновлю свой ответ соответственно.

...