Python 如何获取Django中文件字段的音频持续时间?

Python 如何获取Django中文件字段的音频持续时间?,python,django,audio,Python,Django,Audio,考虑使用此模型: class MusicTrack(models.Model): """ Represents a music track """ title = models.CharField("Track title", max_length=300) audio_file = models.FileField("Audio file", upload_to='audio/%Y-%m-%d/') duration_seconds = mo

考虑使用此模型:

class MusicTrack(models.Model):
    """
    Represents a music track
    """

    title = models.CharField("Track title", max_length=300)
    audio_file = models.FileField("Audio file", upload_to='audio/%Y-%m-%d/')

    duration_seconds = models.PositiveIntegerField("Track duration ins seconds", blank=True, null=True)

    def __str__(self):
        return f"Music track \"{self.title}\""
如何获取以秒为单位的音频持续时间并将其保存在数据库中?

您可以使用它来获取音频信息,如持续时间

要保存它,您可以将信号连接到django型号,并更新
持续时间\u秒
字段。最好仅在实际文件更新时执行此操作,以减少磁盘i/o并提高性能

信号接收器代码如下所示:

# considering model has audio_field = FileField()       
import mutagen

def some_pre_save_receiver(sender, instance, raw, using, update_fields, **kwargs):

    file_was_updated = False
    if hasattr(instance.audio_file, 'file') and isinstance(instance.audio_file.file, UploadedFile):
        file_was_updated = True

    if update_fields and "audio_file" in update_fields:
        file_was_updated = True          

    if file_was_updated:
        # read audio file metadata
        audio_info = mutagen.File(instance.audio_file).info
        # set audio duration in seconds, so we can access it in database
        instance.duration_seconds = int(audio_info.length)

        print(">> audio duration was was updated")

    else:
        print(">> file not changed - duration was NOT updated")