Автор Гілка: Проблема з генерацією відео з картинки та aac у ffmpeg  (Прочитано 3269 раз)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3860
  • Карма: +13/-0
  • Програміст
Я маю .aac та заставку у форматі jpeg. Я генерую відео наступною командою:

fmpeg -loop 1 -r 1 -i "$BACKGROUND" -i "$MUSIC" -acodec copy -tune stillimage -r 1 -shortest -vf scale=640:-2,format=yuv420p -pix_fmt yuv420p "$OUTPUT"

При програванні створеного кліпу mplayer-ом, на 50-й секунді він видає помилку:

A:  50.0 V:  50.0 A-V:  0.000 ct:  0.000   0/  0  0%  0%  0.4% 1 0                                                                                                     
Possibly bad interleaving detected.
Use -ni option if this causes playback issues and avoid or fix the program that created the file.

При завантаженні на reddit, файл вивантажується, але після 50-ї секунди відео відсутнє.
[Fedora Linux]

Відсутній Хорошее настроение

  • Новачок
  • *
  • дописів: 5
  • Карма: +0/-0
Проблема, яку ви описуєте, пов'язана з **неправильним інтерлівінгом** (interleaving) аудіо та відео потоків у вашому файлі. Це може бути викликано тим, що FFmpeg неправильно обробляє тривалість аудіо та відео, особливо коли використовується параметр `-shortest`. Ось кілька способів вирішити цю проблему:

---

### **1. Використання параметра `-shortest`**
Параметр `-shortest` обрізає вихідний файл до найкоротшого потоку (аудіо або відео). У вашому випадку, якщо аудіо коротше за відео, це може призвести до проблем. Спробуйте видалити `-shortest` і вручну вказати тривалість відео за допомогою параметра `-t`:

```bash
ffmpeg -loop 1 -r 1 -i "$BACKGROUND" -i "$MUSIC" -acodec copy -tune stillimage -r 1 -vf scale=640:-2,format=yuv420p -pix_fmt yuv420p -t $(ffprobe -i "$MUSIC" -show_entries format=duration -v quiet -of csv="p=0") "$OUTPUT"
```

Тут `$(ffprobe -i "$MUSIC" -show_entries format=duration -v quiet -of csv="p=0")` автоматично визначає тривалість аудіофайлу та встановлює її як тривалість відео.

---

### **2. Використання параметра `-fflags +genpts`**
Цей параметр генерує відсутні PTS (Presentation Time Stamps) для відео, що може допомогти уникнути проблем з інтерлівінгом:

```bash
ffmpeg -loop 1 -r 1 -i "$BACKGROUND" -i "$MUSIC" -acodec copy -tune stillimage -r 1 -vf scale=640:-2,format=yuv420p -pix_fmt yuv420p -fflags +genpts -shortest "$OUTPUT"
```

---

### **3. Використання параметра `-vsync vfr`**
Цей параметр вказує FFmpeg використовувати змінну частоту кадрів (Variable Frame Rate), що може допомогти уникнути проблем із синхронізацією:

```bash
ffmpeg -loop 1 -r 1 -i "$BACKGROUND" -i "$MUSIC" -acodec copy -tune stillimage -r 1 -vf scale=640:-2,format=yuv420p -pix_fmt yuv420p -vsync vfr -shortest "$OUTPUT"
```

---

### **4. Перекодування аудіо**
Іноді проблеми виникають через те, що аудіо потік не підтримує правильний інтерлівінг. Спробуйте перекодувати аудіо замість використання `-acodec copy`:

```bash
ffmpeg -loop 1 -r 1 -i "$BACKGROUND" -i "$MUSIC" -c:a aac -b:a 192k -tune stillimage -r 1 -vf scale=640:-2,format=yuv420p -pix_fmt yuv420p -shortest "$OUTPUT"
```

---

### **5. Перевірка вихідного файлу**
Після створення відео перевірте його за допомогою `ffprobe`, щоб переконатися, що всі потоки синхронізовані:

```bash
ffprobe "$OUTPUT"
```

---

### **6. Альтернативний підхід**
Якщо жоден із вищезазначених методів не допоміг, спробуйте створити відео без використання `-loop` і `-shortest`. Наприклад:

```bash
ffmpeg -framerate 1 -i "$BACKGROUND" -i "$MUSIC" -c:v libx264 -c:a aac -b:a 192k -vf scale=640:-2,format=yuv420p -pix_fmt yuv420p -t $(ffprobe -i "$MUSIC" -show_entries format=duration -v quiet -of csv="p=0") "$OUTPUT"
```


Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3860
  • Карма: +13/-0
  • Програміст
Я теж спробував скористатися ШІ, і він не допоміг мені вирішити проблему.
[Fedora Linux]