Sprawnie działający przykład konwertujący plik mp4 do mp3.

Sprawnie działający przykład konwertujący plik mp4 do mp3.
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Cześć:)

Zacznę od wywodu wstępnego ;) Tak, wiem miałem ruszyć dupsko z programowaniem i wieloma projektami, ale znów źle dziele sobie wolny czas i nie umiem przestawić się na ślęczenie jak kiedyś nad Delphi i mniej PHP a także nadal nie umiem być uzależniony od chęci bawienia się jednak lepiej poznanym Delphi 7 - niż nowszymi środowiskami. Może kolejna pomoc od Was zmotywuje mnie by ruszyć jeden od dawna już zaplanowany projekt który ułatwił by pewne sprawy niewidomym Znajomym a go Im obiecałem. Także do rzeczy :)

Chciałem poprosić Was o jakiś sprawnie działający przykład kodu z kompletem plików za równo bibliotek jak i unitów albo opis co i jak, by dokonać konwersji będącego na dysku pliku mp4 do pliku mp3 gdzie zachowujemy bitrate źródłowy i inne parametry a najszybciej jak się da uzyskujemy z pliku filmowego same audio. A nie chcę kombinować tak jakby na około z uruchamianiem ffmpeg.exe w konsoli komponentem typu TDosCommand.

Tylko tak prosto jak się da, pobrać czas pliku mp4 i jak konwersja chwile trwa, pokazać postęp w procentach. Bo takowe będzie najprostsze ale wiem ze są w sieci kontrolki w zestawie. Ostatnio kombinowałem na szybko jakąś dłuższą chwilę z tym co znalazłem ale dllki wyszukiwałem ręcznie i nie udało się mi z użyciem libavutil. Może coś jest stricte do ffmpeg podobne a może coś innego co się sprawdzi tak jak FFMPEG konsolowy, a będzie niezawodne.

Tak, idę nieco na łatwiznę prosząc o gotowca. Nieco kiedyś ambitnej ślęczałem nad tematem, ale na szybko grzebiąc z paczką przykładów i plikami libavutil - nie udało się mi wiele wskórać. Jeśli się nie uda z Waszą pomocą to może będę musiał "polecieć po najniższej linii" oporu i się posiłkować konsolą z narzędziami w plikach zewnętrznych, ale mało to eleganckie. A szukałem w sieci jednak być może i źle. Także nadal stoję w punkcie wyjścia. Nie mając pożądanych konkretów.

Z góry dziękuję za wszelkie przykłady kodów i cenne wskazówki jak podejść poprawnie do tematu.


Pozdrawiam.
edytowany 1x, ostatnio: olesio
Azarien
"nie chcę kombinować tak jakby na około z uruchamianiem ffmpeg.exe" - ale to byłoby najprostsze…
olesio
Ok, jeśli nikt tutaj nic innego nie da rady pomóc mi z tym to chyba tak zrobię. Ponieważ przykłady używające bibliotek avutil niestety mają jakieś problemy z tym że mp4ka ma niby drugi stream, a kod jest zbyt zawiły dla mnie abym go pozmieniał. Do tego inne komponenty w pakiecie nie chcą się zainstalować z pliku *.dpk bo poza plikami *.dcu również trzeba plików źródłowych. A ich brak.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 17 godzin
2

ffmpeg.exe to frontend dla składowych bibliotek: libavcodec, libavfilter, libavformat itp.
Źródła wszystkiego są dostępne.
Z pewnością dałoby się wykorzystać te biblioteki w Delphi i przeprowadzić operację taką, jaką robi ffmpeg.exe z konkretnymi parametrami.

mp4 do pliku mp3 gdzie zachowujemy bitrate źródłowy i inne parametry

Nie ma wielkiego sensu „zachowywanie bitrate” bo mp4 to kontener mogący przechowywać dźwięk w dowolnym formacie (choć zwykle jest to AAC) a mp3 to goły strumień MPEG-1 Layer 3. Bitrate jednego nie jest równoważny bitrate'owi drugiego: MP3 potrzebuje większego bitrate od AAC dla zachowania tej samej jakości (która i tak będzie trochę niższa przez sam fakt rekodowania strumienia).

edytowany 1x, ostatnio: Azarien
AK
uprzedziłeś mnie z wypowiedzią, że MP4 to kontener a nie format.
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
2

Weź sobie źródła ffmpeg, przetłumacz na pascala i już masz

[edit]
Niektórzy nie rozumieją, uściślam. Nie trzeba tłumaczyć na Delphi całego ffmpeg i wszystkich dll. Warto jednak zajrzeć w źródła exeka ffmoeg, bo to gotowy przykład jak skorzystać z ich api (ffmpeg.exe woła funkcje z dll), inaczej nawet mając nagłówki w Delphi nie będzie to oczywiste.

edytowany 2x, ostatnio: kulson
Zobacz pozostałe 9 komentarzy
KU
P.S. twoja usilna chęć pokazania, jak to ja jestem "spalony" wynika tylko z twojego zacietrzewienia, a nie obiektywnych przesłanek. Możesz rzucać gównem w moim kierunku, ale ośmieszasz się tym tylko
flowCRANE
Jesteś spalony, czego dowodem są odpowiedzi innych użytkowników na twoje wypociny. Blamuj się dalej – z chęcią popatrzę na to z popkornem w ręku.
KU
No, np ocena tego posta. Ten co ocenił, też spalony. Zrozum, nie wymagam, żebyś rozumiał co piszę. Być może masz mniejszą wiedzę. Ale nie zachowuj się jak dziecko w piaskownicy, masz chyba więcej już 5 lat? Może mało widziałeś aplikacji, które parsują output, może przerażają cię źródła ffmpeg i ty byś nic z nich nie zrozumiał. Ok, nie mam z tym problemu. Ale nie wiem w jakim celu usiłujesz zrobić z siebie durnia. Po co ci to?
flowCRANE
Tak sobie tłumacz.
KU
Ja sobie nic nie tłumaczę, odpowiadam na twoje dziecinne zaczepki
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Hej. Nie mam takowej wiedzy o C/C++ i na to czasu. Chyba jednak pokątne wywoływanie ffmpeg.exe będzie najprostsze. Niestety tylko część przykładów w Pascalu działa, ale nie działa konwersja, którą ciężko jest ogarnąć. Wykrywa np. 2 strumienie. Jeśli miałbym czas i wiedza na przetłumaczenie być może sprawnie działających kodów z innych języków gdzie będą niuanse składni itp na których polegnę nie pytał bym o to, ponieważ wiem że wielu tutaj z masterów Delphi ;) klepało dla siebie czy pisało porządnie nie jedno i myślałem że też takowy temat rozpracowywali skutecznie, to pozostało im w zapiskach. Ale jeśli coś może ktoś znajdzie jeszcze to się zechce podzielić :)


Pozdrawiam.
pelsta
  • Rejestracja:prawie 19 lat
  • Ostatnio:23 dni
  • Postów:819
1

Jeśli dobrze zrozumiałem to chcesz wyciągnąć z mp4 tylko audio?
Ja robię to tak
ffmpeg -i film.mp4 -vn audio.mp3

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

O tego nie znałem, dzięki sprawdzę, bo pewnie szybsze niż konwersja pliku. Nadal jednak pozostaje kwestia jak to zrobić bardziej elegancko poprzez biblioteki jakieś a nie wywoływanie ffmpeg.exe bo na razie na takiej metodzie się chyba niestety muszę skupić.


Pozdrawiam.
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Gorlice
2

Jeżeli juz chcesz się bawić w ffmpeg to zrób to po ludzku a nie wywołaniem polecenia z linii komend.
Masz nagłówki bibliotek w Delphi a w przykładach z tego co widzę demuxing więc o ile się nie mylę to powinno zrobić rozłożenie pliku na video i audio tylko czy to obsługuje MP4 i daje możliwość zapisu audio w MP3 to już sprawdź sam.
https://github.com/DelphiForBroadcasting/ffmpeg-delphi


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Hej.

Faktycznie ten przykład działa i po zmianie może by nie dekodował czy tam wydobywał też czystego video co wydłuża proces. Ale właśnie słowo "RAW" jest tutaj kluczowego bo do tego co wydobyte jest z pliku jest odtwarzalne wedle podawanej komendy przykładowej poprzez ffplay. I z przykładowej mp4ki zajmującej 96 MB same audio ma 251 MB. Mi zależało by raczej znaleźć taki przykład albo z Waszą pomocą przerobić istniejące aby wykonywało się bez użycia ffmpeg.exe to samo co dokonać można poleceniem, które podał mi tu powyżej pelsta.


Pozdrawiam.
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0
olesio napisał(a):

Hej. Nie mam takowej wiedzy o C/C++ i na to czasu. Chyba jednak pokątne wywoływanie ffmpeg.exe będzie najprostsze. Niestety tylko część przykładów w Pascalu działa, ale nie działa konwersja, którą ciężko jest ogarnąć. Wykrywa np. 2 strumienie. Jeśli miałbym czas i wiedza na przetłumaczenie być może sprawnie działających kodów z innych języków gdzie będą niuanse składni itp na których polegnę nie pytał bym o to, ponieważ wiem że wielu tutaj z masterów Delphi ;) klepało dla siebie czy pisało porządnie nie jedno i myślałem że też takowy temat rozpracowywali skutecznie, to pozostało im w zapiskach. Ale jeśli coś może ktoś znajdzie jeszcze to się zechce podzielić :)

No ale jak nie masz czasu, to nie ma drogi na skróty, musisz sobie to napisać, skoro nikt tego nie zrobił w Delphi jak dotąd. A jak masz naprawdę mało czasu i duże ciśnienie, to zleć to komuś. To nie są takie trywialne tematy, że od ręki i jest. Łatwiej ci będzie parsować output ffmpega, takie jest moje zdanie. Na moje oko z 80% wypaśnych konwerterów/edytorów wideo i audio tak działa, że wywołuje pod spodem ffmpeg.exe i w ten sposób konwertuje formaty, przekierowując progress z konsoli do swojego gui. To nie jest trudne (ok, przyznaję sie że nie wiem, w Delphi może jednak trudne, ale chyba nie aż tak bardzo)

P.S. co to za gadanie "oo tego nie znałem"? Wystarczy poczytać np to: https://linux.die.net/man/1/ffmpeg (windows - analogicznie) i masz opis parametrów ffmpeg, jakie przyjmuje. A teraz to wygląda na to, że chcesz przyjść na gotowca, a sam nie zadajesz sobie minimum trudu, czyli robisz to, za co moderacja tu gani użytkowników.

edytowany 2x, ostatnio: kulson
KA
Żadna poważna aplikacja nie robi konwersji z linii komend ffmpeg.exe do tego używa się wywołań funkcji bibliotek dll do których plików nagłówkowych dla Delphi ja i @Paweł Dmitruk podaliśmy linki.
KU
A to byś się zdziwił, jak wiele aplikacji działa jako nakładki gui na narzędzia konsolowe, to co mi przychodzi na szybko do głowy to mkv toolnix gui i do niedawna Handbrake. Nie ma w tym zresztą nic złego wbrew pozorom. Tak btw, do samego ffmpeg też jest pełno nakładek gui
KA
@kulson nakładki robi się w przypadku zamkniętego oprogramowania gdy ma dostępu dokumentacji, API czy czegokolwiek co pozwalałoby właśnie tego uniknąć. W przypadku ffmpeg jeżeli ktoś tak robi to popełnia duży błąd i sam sobie utrudnia życie np. po co się bawić w jakieś gówniane parsowanie wyjścia konsoli aby pokazać status czy pasek postępu zadania?
KU
Nie mówię, że w tym przypadku to najlepsze wyjście. Co jednak za tym przemawia? Autor chce szybko, a wykorzysta promil możliwości api, które jest skomplikowane. Wtedy być może lepiej parsować prosty output, zamiast przekopywać się przez zawiłości api tych bibliotek. Grubo się mylisz, że tylko zamknięte oprogramowanie, na Linuksach np większość menedżerów plików w ten sposób obsługuje rozpakowanie archiwów, gdzie program pakujący w konsoli nie wystawia żadnego api. Wszelkie nakładki gui na git-a też tak działają, a git jest otwarty. Itd
KA
Nie wątpię, że ktoś tak robi ale nie oznacza to, że to jest dobra praktyka.
PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:3 minuty
3

tutaj możesz pobrać przetłumaczone nagłówki wraz z przykładami: http://www.delphiffmpeg.com/headers/
a tutaj potrzebne biblioteki: http://www.delphiffmpeg.com/downloads/


pozdrawiam
paweld
Szalony Programista
Szalony Programista
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:227
1

Tu jest w miarę fajny tutorial do ffmpega jakby ktoś chciał, http://dranger.com/ffmpeg/

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
1

Hej.

Nie ma to jak się przebudzić w nocy stwierdzić że nie chce się spać i przysiąść nad problemem raz jeszcze. Kajam się, za lenistwo moje i to na serio :) Teraz mam działający FFMPEG pod Delphi 7. Na szybko skompilowałem przykłady i będę je analizował. Ale może nim dojdę co jest nie tak scalając działający z ubogim kodem i wklejając to czego jest więcej w drugim może mi podpowiecie dlaczego przykładowy projekt w ścieżce Demos\SimplePlayer elegancko mi wszystkie pliki z dysku odtwarza i to wraz z dźwiękiem.

Natomiast mający zawarte więcej opcji i na nie wyciszonych ani nie ściszonych ustawieniach projekt w Demos\Player odtwarza mi elegancko pliki ale zarówno filmowe jak i mp3 nie emitują dźwięku, gdzie w skromniejszym przykładzie emitują. Pobrałem to wszystko w paczce nazwanej dokładnie FFVCL_Lite.v7.1a_DCU-Encoder-Player a dorzuciłem skądś już pobrany LIBAV z bibliotekami w większości w wersji 5.8 i jedynie avutil tam wnioskując z nazwy jest w wersji 5.6.

Ale takich plików oczekuje owe przykładowe DEMO. I teraz super. Bo odpowiednio popatrzeć co mi potrzebne. Być może to popakować UPX i posprawdzać z czasem i mamy zgrabny Player czy to lokalnie czy do plików online do wielu celów, pod odtwarzanie czy docelowo jakiś prosty konwerter lub odczyt meta danych, czyli to wszystko na co pozwala FFMPEG w tym pakiecie lite. A nie trzeba do jakichś celów zapodawać całą opasłą kobyłę VLC :)

Z góry dzięki za sugestie. Może ktoś miał podobne objawy. Ja muszę, jak wspominałem nauczyć się dzielić czas wolny pomiędzy nową pasję i stare niekorzystne dla wagi i zdrowia wielogodzinne czy nawet wielodniowe ślęczenie przy projektach. Fakt, wtedy mogłem na tym Forum odciążać FP ale cóż najwyżej On zajada to co ja sobie zgubiłem, a obrotniej sobie radzi w wyszukiwaniu przykładów i troll mu nie zarzuci lenistwa chyba ;P


Pozdrawiam.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)