[英]FFmpeg in Python File already exists error
I'm working on a project using python(3.6) and Django(2.0) in which i'm converting a video to mp4 if it's in any other formate. 我正在使用python(3.6)和Django(2.0)开发一个项目,如果其中有其他格式,我会将视频转换为mp4。
Here's my code: 这是我的代码:
from views.py: 来自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')
But when I pass it a video of Mp4 format it returns an error in the IDE console like this: 但是,当我将其传递给Mp4格式的视频时,会在IDE控制台中返回如下错误:
ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers built with Apple LLVM version 10.0.0 (clang-1000.10.43.1) configuration: --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 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'PHP_GCS.mp4': Metadata: major_brand : mp42 minor_version : 1 compatible_brands: mp41mp42isom creation_time : 2018-08-03T13:08:04.000000Z Duration: 00:01:21.40, start: 0.000000, bitrate: 1584 kb/s Stream #0:0(und): V
ffmpeg版本4.0.2版权所有(c)2000-2018年,使用Apple LLVM版本10.0.0(clang-1000.10.43.1)配置构建的FFmpeg开发人员:--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. 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:1compatible_brands:mp41mp42isom creation_time:2018-08-03T13:08:04.000000Z持续时间:00:01:21.40,开始:0.000000,比特率:1584 kb / s流#0:0(und):V ideo: h264 (Main) (avc1 / 0x31637661), yuv420p, 1918x1078 [SAR 1:1 DAR 137:77], 1581 kb/s, 30 fps, 30 tbr, 600 tbn, 1200 tbc (default) Metadata: creation_time : 2018-08-03T13:08:04.000000Z handler_name : Core Media Video
ideo:h264(主要)(avc1 / 0x31637661),yuv420p,1918x1078 [SAR 1:1 DAR 137:77],1581 kb / s,30 fps,30 tbr,600 tbn,1200 tbc(默认)元数据:creation_time:2018 -08-03T13:08:04.000000Z handler_name:核心媒体视频
File 'PHP_GCS.mp4' already exists.
文件“ PHP_GCS.mp4”已存在。 Overwrite ?
覆盖? [y/N]
[Y / N]
and stop the execution here until I press the enter button.I'm really confused why this is happining because when the video is already mp4 i'm not using ffmpeg
but only for thumbnail generaton. 并在这里停止执行,直到按Enter键。我真的很困惑为什么会如此,因为当视频已经是mp4时,我不使用
ffmpeg
而是仅用于缩略图生成。
What can be wrong here? 这里有什么问题?
Thanks in advance! 提前致谢!
I think you missed something in your code. 我认为您错过了代码中的某些内容。
You Post handler in video converter has this code: 视频转换器中的Post Post处理程序具有以下代码:
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
but you're not checking the correct part on your if statement. 但是您没有检查if语句中的正确部分。
You should write if ext[-1] == 'mp4'
because right now you're comparing a list with a string which will always return false! if ext[-1] == 'mp4'
应该编写if ext[-1] == 'mp4'
因为现在您正在将列表与字符串进行比较,该字符串将始终返回false!
This might solve your problem and if not please let me know and I will update my answer accordingly. 这可能会解决您的问题,如果不能解决,请告诉我,我将相应地更新答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.