Как получить длительность видео при загрузке файла в представлении Django.(с помощью ffprobe)
Я создаю службу потокового видео с помощью Django. Я хочу получить длительность видео, когда видео кодируется. Я установил ffmpeg с помощью brew (Mac OS), создал команду с подпроцессом, но она не работает. Я не знаю, что мне нужно сделать.
Это вещи, которые я пробовал.
views.py
class MovieUpload(user_mixins.MoiveUploadPermissionView, FormView):
"""MovieUpload View"""
form_class = forms.MovieUploadForm
template_name = "movies/movie_upload.html"
def form_valid(self, form):
movie = form.save()
filename = movie.video.path
result = subprocess.check_output(
f'ffprobe -v quiet -show_streams -select_streams v:0 -of json "{filename}"',
shell=True,
).decode()
fields = json.loads(result)["streams"][0]
duration = fields["tags"]["DURATION"]
print(duration)
movie.user = self.request.user
movie.save()
return redirect(reverse("movies:detail", kwargs={"pk": movie.pk}))
Я пробовал это, но выдает ошибку: Команда 'ffprobe -v quiet -show_streams -select_streams v:0 -of json "/Users/bami/Documents/cineacca/uploads/SampleVideo_1280x720_20mb.mp4" вернула ненулевой статус выхода 1. Я попробовал использовать только имя файла, а не filepath, но ошибка была той же самой.
class MovieUpload(user_mixins.MoiveUploadPermissionView, FormView):
"""MovieUpload View"""
form_class = forms.MovieUploadForm
template_name = "movies/movie_upload.html"
def form_valid(self, form):
movie = form.save()
filename = movie.video.path
duration = subprocess.check_output(
[
"ffprobe",
"-i",
f"{filename}",
"-show_entries",
"format=duration",
"-v",
"quiet",
"-of",
"csv=%s" % ("p=0"),
]
)
print(duration)
movie.user = self.request.user
movie.save()
return redirect(reverse("movies:detail", kwargs={"pk": movie.pk}))
Этот код выдает ту же ошибку.
class MovieUpload(user_mixins.MoiveUploadPermissionView, FormView):
"""MovieUpload View"""
form_class = forms.MovieUploadForm
template_name = "movies/movie_upload.html"
def form_valid(self, form):
movie = form.save()
filename = movie.video.path
result = subprocess.run(
[
"ffprobe",
"-v",
"error",
"-show_entries",
"format=duration",
"-of",
"default=noprint_wrappers=1:nokey=1",
filename,
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
print(result)
movie.user = self.request.user
movie.save()
return redirect(reverse("movies:detail", kwargs={"pk": movie.pk}))
Этот код не приводит к той же ошибке, и новый объект создается хорошо но все равно не работает, в моей консоли выдает следующее сообщение,
CompletedProcess(args=['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'default=noprint_wrappers=1:nokey=1', '/Users/bami/Documents/cineacca/uploads/SampleVideo_1280x720_20mb. mp4'], returncode=1, stdout=b'/Users/bami/Documents/cineacca/uploads/SampleVideo_1280x720_20mb.mp4: No such file or directory\n')
>