
Recherche avancée
Médias (2)
-
GetID3 - Bloc informations de fichiers
9 avril 2013, par
Mis à jour : Mai 2013
Langue : français
Type : Image
-
GetID3 - Boutons supplémentaires
9 avril 2013, par
Mis à jour : Avril 2013
Langue : français
Type : Image
Autres articles (73)
-
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir -
XMP PHP
13 mai 2011, parDixit Wikipedia, XMP signifie :
Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...) -
Sélection de projets utilisant MediaSPIP
29 avril 2011, parLes exemples cités ci-dessous sont des éléments représentatifs d’usages spécifiques de MediaSPIP pour certains projets.
Vous pensez avoir un site "remarquable" réalisé avec MediaSPIP ? Faites le nous savoir ici.
Ferme MediaSPIP @ Infini
L’Association Infini développe des activités d’accueil, de point d’accès internet, de formation, de conduite de projets innovants dans le domaine des Technologies de l’Information et de la Communication, et l’hébergement de sites. Elle joue en la matière un rôle unique (...)
Sur d’autres sites (7463)
-
Stage-Whisper is not working because of missing files
24 novembre 2023, par TingtongI tried to install this here : https://github.com/Stage-Whisper/Stage-Whisper


Once i put the audio file in it, it is still loading and loading but not transcribing it.


So after that i checked the requirements and packages, if there is something missing and there is. I installed those here :


Node (required for Electron)
Yarn (required for Electron)
Python 3.x (required for backend)
Rust (required for backend)
ffmpeg (required for backend)
Poetry (required for backend)



I installed them with homebrew. There are some errors showing up, once i launch the electron programm with "yarn dev" : ERROR : "could not locate binding files"


I also tried "poetry run python stagewhisper —input /path/to/audio/file.mp3", but got following message. Poetry could not find a pyproject.toml file in /Users/Administrator/Desktop/Stage-Whisper or its parents.


Where do i have to put the file pyproject.toml and what do i have to write in it ?


So i checked with brew info all tools which i need for Stage-Whisper. Screenshots :enter image description here
[enter image description here](https://i.stack.imgur.com/sirb3.png)


What i tried was to update those packages/requirements which where missing, with "sudo port install requirementPackageName ". But after checking with brew info again, those parts are still missing. So does that actually work or do i have to install those missing stuff with homebrew ? I have Mac Mojave 10.14.6 and Homebrew 4.1.18 Version.


I also got an error, while i installed those tools with homebrew :


ERROR : You are using macOS 10.14.
We (and Apple) do not provide support for this old version. It is expected behaviour that some formulae will fail to build in this old version... etc


Thank you for your help guys.


Edit :




yarn install v1.22.19 warning ../../../package.json : No license field
[1/4] 🔍 Resolving packages... [2/4] 🚚 Fetching packages... [3/4]
🔗 Linking dependencies... warning "@emotion/react >
@emotion/babel-plugin@11.10.2" has unmet peer dependency
"@babel/core@^7.0.0". warning "@emotion/react > @emotion/babel-plugin




@babel/plugin-syntax-jsx@7.18.6" has unmet peer dependency "@babel/core@^7.0.0-0". warning " > autoprefixer@10.4.4" has unmet
peer dependency "postcss@^8.1.0". warning " >
eslint-config-airbnb@19.0.4" has unmet peer dependency
"eslint-plugin-react-hooks@^4.3.0".
[----------------------------------------------------------------------------------------------------------------------------------------------------------------------------] 0/890^[4/4] 🔨 Building fresh packages... [1/7] ⠁ better-sqlite3
[-/7] ⠁ waiting... [3/7] ⠁ sqlite3 [4/7] ⠁ esbuild error
/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/better-sqlite3 :
Command failed. Exit code : 1 Command : prebuild-install || npm run
build-release Arguments : Directory :
/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/better-sqlite3
Output : prebuild-install warn install No prebuilt binaries found
(target=20.9.0 runtime=node arch=x64 libc= platform=darwin)






better-sqlite3@7.6.2 build-release
node-gyp rebuild —release




gyp info it worked if it ends with ok gyp info using node-gyp@9.3.0
gyp info using node@20.9.0 | darwin | x64 gyp info find Python using
Python version 3.9.14 found at "/usr/local/bin/python3" gyp info spawn
/usr/local/bin/python3 gyp info spawn args [ gyp info spawn args

'/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/electron-rebuild/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args 'binding.gyp', gyp info spawn args '-f', gyp
info spawn args 'make', gyp info spawn args '-I', gyp info spawn
args

'/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/better-sqlite3/build/config.gypi',
gyp info spawn args '-I', gyp info spawn args

'/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/electron-rebuild/node_modules/node-gyp/addon.gypi',
gyp info spawn args '-I', gyp info spawn args

'/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/common.gypi',
gyp info spawn args '-Dlibrary=shared_library', gyp info spawn args
'-Dvisibility=default', gyp info spawn args

'-Dnode_root_dir=/Users/administrator/Library/Caches/node-gyp/20.9.0',
gyp info spawn args

'-Dnode_gyp_dir=/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/electron-rebuild/node_modules/node-gyp',
gyp info spawn args

'-Dnode_lib_file=/Users/administrator/Library/Caches/node-gyp/20.9.0/<(target_arch)/node.lib',
gyp info spawn args

'-Dmodule_root_dir=/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/better-sqlite3',
gyp info spawn args '-Dnode_engine=v8', gyp info spawn args

'—depth=.', gyp info spawn args '—no-parallel', gyp info spawn
args '—generator-output', gyp info spawn args 'build', gyp info
spawn args '-Goutput_dir=.' gyp info spawn args ] gyp info spawn
make gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]

TOUCH ba23eeee118cd63e16015df367567cb043fed872.intermediate ACTION
deps_sqlite3_gyp_locate_sqlite3_target_copy_builtin_sqlite3
ba23eeee118cd63e16015df367567cb043fed872.intermediate TOUCH
Release/obj.target/deps/locate_sqlite3.stamp CC(target)
Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o LIBTOOL-STATIC
Release/sqlite3.a CXX(target)
Release/obj.target/better_sqlite3/src/better_sqlite3.o In file
included from ../src/better_sqlite3.cpp:4 : In file included from
./src/better_sqlite3.lzz:11 : In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/node.h:73 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8.h:24 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-array-buffer.h:12 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-local-handle.h:12 :
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:465:30 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
SHARED_EXTERNAL_POINTER_TAGS(CHECK_SHARED_EXTERNAL_POINTER_TAGS)
^ /Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:465:30 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:465:30 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:465:30 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:465:30 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
PER_ISOLATE_EXTERNAL_POINTER_TAGS(CHECK_NON_SHARED_EXTERNAL_POINTER_TAGS)
^ /Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:466:35 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:693:61 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
static_assert(kJSObjectType + 1 == kFirstJSApiObjectType) ;
^
, "" /Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:694:55 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
static_assert(kJSObjectType < kLastJSApiObjectType) ;
^
, "" /Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-internal.h:695:63 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
static_assert(kFirstJSApiObjectType < kLastJSApiObjectType) ;
^
, "" In file included from ../src/better_sqlite3.cpp:4 : In file included from
./src/better_sqlite3.lzz:11 : In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/node.h:73 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8.h:24 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-array-buffer.h:13 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-object.h:9 :
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-maybe.h:106:45 :
error : no template named 'is_lvalue_reference_v' in namespace 'std' ;
did you mean 'is_lvalue_reference' ? template>
 ^ 
is_lvalue_reference /Library/Developer/CommandLineTools/usr/include/c++/v1/type_traits:780:50 :
note : 'is_lvalue_reference' declared here template struct
_LIBCPP_TEMPLATE_VIS is_lvalue_reference : public false_type {} ;
^ In file included from ../src/better_sqlite3.cpp:4 : In file included from
./src/better_sqlite3.lzz:11 : In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/node.h:73 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8.h:24 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-array-buffer.h:13 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-object.h:9 :
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-maybe.h:106:69 :
error : expected '(' for function-style cast or type construction

template>
 ^ /Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-maybe.h:123:43 :
error : no template named 'is_lvalue_reference_v' in namespace 'std' ;
did you mean 'is_lvalue_reference' ? template * = nullptr>
 ^ 
is_lvalue_reference /Library/Developer/CommandLineTools/usr/include/c++/v1/type_traits:780:50 :
note : 'is_lvalue_reference' declared here template struct
_LIBCPP_TEMPLATE_VIS is_lvalue_reference : public false_type {} ;
^ In file included from ../src/better_sqlite3.cpp:4 : In file included from
./src/better_sqlite3.lzz:11 : In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/node.h:73 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8.h:24 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-array-buffer.h:13 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-object.h:9 :
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-maybe.h:123:67 :
error : expected '(' for function-style cast or type construction
template * =
nullptr>
 ^ In file included from ../src/better_sqlite3.cpp:4 : In file included from
./src/better_sqlite3.lzz:11 : In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/node.h:73 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8.h:33 :
In file included from
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-function.h:11 :
/Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-function-callback.h:151:66 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
kReturnValueDefaultValueIndex - kReturnValueIndex) ;
^
, "" /Users/administrator/Library/Caches/node-gyp/20.9.0/include/node/v8-function-callback.h:153:50 :
warning : static_assert with no message is a C++17 extension
[-Wc++17-extensions]
kIsolateIndex - kReturnValueIndex) ;
^
, "" ./src/util/macros.lzz:157:21 : error : no member named
'AccessorSignature' in namespace 'v8'
v8::AccessorSignature::New(isolate, recv)
 ^ ./src/util/binder.lzz:37:51 : error : no member named 'CreationContext' in 'v8::Object'
v8::Local ctx = obj->CreationContext() ;
 ^ 22 warnings and 6 errors generated. make : ***
[Release/obj.target/better_sqlite3/src/better_sqlite3.o] Error 1 rm
ba23eeee118cd63e16015df367567cb043fed872.intermediate gyp ERR ! build
error gyp ERR ! stack Error : make
failed with exit code : 2 gyp ERR !
stack at ChildProcess.onExit
(/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/electron-rebuild/node_modules/node-gyp/lib/build.js:203:23)
gyp ERR ! stack at ChildProcess.emit (node:events:514:28) gyp ERR !
stack at ChildProcess._handle.onexit
(node:internal/child_process:294:12) gyp ERR ! System Darwin 18.7.0 gyp
ERR ! command "/usr/local/bin/node"
"/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/.bin/node-gyp"
"rebuild" "—release" gyp ERR ! cwd
/Users/administrator/Desktop/Stage-Whisper/electron/node_modules/better-sqlite3



Same goes for the the "poetry install" command in the backend folder :


8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/build/onig_sys-3a9a2f947b5ad744/out
warning: variable does not need to be mutable --> tokenizers-lib/src/models/unigram/model.rs:265:21 | 265 | let mut target_node = &mut best_path_ends_at[key_pos]; | ----^^^^^^^^^^^ | | | help: remove this
mut| = note:
#[warn(unused_mut)]` on by default

warning : variable does not need to be mutable
—> tokenizers-lib/src/models/unigram/model.rs:282:21
|
282 | let mut target_node = &mut best_path_ends_at[starts_at + mblen] ;
| ----^^^^^^^^^^^
| |
| help : remove this
mut


warning : variable does not need to be mutable
—> tokenizers-lib/src/pre_tokenizers/byte_level.rs:200:59
|
200 | encoding.process_tokens_with_offsets_mut(|(i, (token, mut offsets))| 
| ----^^^^^^^
| |
| help : remove this
mut


error : casting
&T
to&mut T
is undefined behavior, even if the reference is unused, consider instead using anUnsafeCell

—> tokenizers-lib/src/models/bpe/trainer.rs:526:47
|
522 | let w = &words[*i] as *const _ as *mut _ ;
| -------------------------------- casting happend here
...
526 | let word : &mut Word = &mut (*w) ;
| ^^^^^^^^^
|
= note :#[deny(invalid_reference_casting)]
on by default

warning :
tokenizers
(lib) generated 3 warnings
error : could not compiletokenizers
(lib) due to previous error ; 3 warnings emitted

Caused by :
process didn't exit successfully :
/Users/administrator/.rustup/toolchains/stable-x86_64-apple-darwin/bin/rustc --crate-name tokenizers --edition=2018 tokenizers-lib/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="cached-path"' --cfg 'feature="clap"' --cfg 'feature="cli"' --cfg 'feature="default"' --cfg 'feature="http"' --cfg 'feature="indicatif"' --cfg 'feature="progressbar"' --cfg 'feature="reqwest"' -C metadata=cb36f9861d265e60 -C extra-filename=-cb36f9861d265e60 --out-dir /private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps -L dependency=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps --extern aho_corasick=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libaho_corasick-021885281f13d108.rmeta --extern cached_path=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libcached_path-767095c4d4a77107.rmeta --extern clap=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libclap-c92d2593d8a75e62.rmeta --extern derive_builder=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libderive_builder-833217c2af636976.dylib --extern dirs=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libdirs-f12e99ecd3a76eae.rmeta --extern esaxx_rs=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libesaxx_rs-b694f04df571686b.rmeta --extern indicatif=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libindicatif-39491a3282a24810.rmeta --extern itertools=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libitertools-b322e49e83853c17.rmeta --extern lazy_static=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/liblazy_static-28a96417d88df3c9.rmeta --extern log=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/liblog-937f94f366843d8a.rmeta --extern macro_rules_attribute=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libmacro_rules_attribute-d4d77bee9330e675.rmeta --extern onig=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libonig-7f9dab4334743bdf.rmeta --extern paste=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libpaste-a36a4a0dbc2ac63f.dylib --extern rand=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/librand-4b1adc86e35ea892.rmeta --extern rayon=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/librayon-d134e48f83d52e6e.rmeta --extern rayon_cond=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/librayon_cond-5715a923c66c54a9.rmeta --extern regex=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libregex-a5c54f2d0034ab98.rmeta --extern regex_syntax=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libregex_syntax-58c405f62323b6ed.rmeta --extern reqwest=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libreqwest-1551c89d20e17f58.rmeta --extern serde=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libserde-f4748cc953dd1338.rmeta --extern serde_json=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libserde_json-5fba404e8440399e.rmeta --extern spm_precompiled=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libspm_precompiled-6bd24072bd3c9d31.rmeta --extern thiserror=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libthiserror-bcbb2769006ee534.rmeta --extern unicode_normalization_alignments=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libunicode_normalization_alignments-658520cf6a5461dc.rmeta --extern unicode_segmentation=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libunicode_segmentation-fffd829ab6256bb0.rmeta --extern unicode_categories=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/deps/libunicode_categories-e3815c3d18c1086b.rmeta -L native=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/build/bzip2-sys-d2cb72d65b178690/out/lib -L native=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/build/zstd-sys-ddff0154a55a136c/out -L native=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/build/esaxx-rs-69d9e34a40d41449/out -L native=/private/var/folders/zc/c2qvlcjd5cgcg5l84484t8vh0000gt/T/tmp2yohvwu_/tokenizers-0.12.1/target/release/build/onig_sys-3a9a2f947b5ad744/out
(exit status : 1)
error :cargo rustc --lib --message-format=json-render-diagnostics --manifest-path Cargo.toml --release -v --features pyo3/extension-module --crate-type cdylib -- -C 'link-args=-undefined dynamic_lookup -Wl,-install_name,@rpath/tokenizers.cpython-311-darwin.so'
failed with code 101

at /usr/local/lib/python3.11/site-packages/poetry/installation/chef.py:166 in _prepare
162│
163│ error = ChefBuildError("\n\n".join(message_parts))
164│
165│ if error is not None :
→ 166│ raise error from None
167│
168│ return path
169│
170│ def _prepare_sdist(self, archive : Path, destination : Path | None = None) -> Path :


Note : This error originates from the build backend, and is likely not a problem with poetry but with tokenizers (0.12.1) not supporting PEP 517 builds. You can verify this by running 'pip wheel —no-cache-dir —use-pep517 "tokenizers (==0.12.1)"'.


UPDATE (SOLVED) :


- 

- i found a solution and this worked for me :




"I had the same problem and nothing mentioned here worked for me. Here is what worked for me :


**("Didnt do this Part")"Require all dependencies you need in the main.js file that is run by electron."** 



What i did was :
Run npm i -D electron-rebuild to add the electron-rebuild package
Remove the node-modules folder, as well as the packages-lock.json file.
Run npm i to install all modules.
Run ./node_modules/.bin/electron-rebuild (.\node_modules.bin\electron-rebuild.cmd for Windows) to rebuild everything


It is very important to run ./node_modules/.bin/electron-rebuild directly after npm i otherwise it did not work on my mac."


But now i get following Error, when i upload and transcribe the file :


> [ELECTRON] NewEntry: Creating new entry with UUID: XY...
[ELECTRON] NewEntry: Copying audio file to store...
[ELECTRON] NewEntry: Audio file copied to store.
[ELECTRON] NewEntry: Entry added to database!
[ELECTRON] RunWhisper: Running model with args [
[ELECTRON] '--verbose',
[ELECTRON] 'true',
[ELECTRON] '--output_dir',
[ELECTRON] '/Users/administrator/Library/Application Support/stagewhisper/store/whisper/2a07203b-ad88-438c-babf-b600cb76aa1d',
[ELECTRON] '--task',
[ELECTRON] 'translate',
[ELECTRON] '--model',
[ELECTRON] 'base',
[ELECTRON] '--device',
[ELECTRON] 'cpu',
[ELECTRON] '--input',
[ELECTRON] '/Users/administrator/Library/Application Support/stagewhisper/store/audio/harvard.mp3'
[ELECTRON] ]
[ELECTRON] RunWhisper: Child process closed with code 1
[ELECTRON] RunWhisper: Error running whisper script!
[ELECTRON] Error occurred in handler for 'run-whisper': Error: Error running whisper script!
[ELECTRON] at ChildProcess.<anonymous> (/Users/administrator/Desktop/Stage-Whisper/electron/main/handlers/runWhisper/runWhisper.js:234:31)
[ELECTRON] at ChildProcess.emit (node:events:390:28)
[ELECTRON] at maybeClose (node:internal/child_process:1064:16)
[ELECTRON] at Socket.<anonymous> (node:internal/child_process:450:11)
[ELECTRON] at Socket.emit (node:events:390:28)
[ELECTRON] at Pipe.<anonymous> (node:net:687:12)

 
</anonymous></anonymous></anonymous>


-
How to stream synchronized video and audio in real-time from an Android smartphone using HLS while preserving orientation metadata ?
6 mars, par Jérôme LAROSEHello, 
I am working on an Android application where I need to stream video
from one or two cameras on my smartphone, along with audio from the
microphone, in real-time via a link or web page accessible to users.
The stream should be live, allow rewinding (DVR functionality), and be
recorded simultaneously. A latency of 1 to 2 minutes is acceptable,
and the streaming is one-way. 

I have chosen HLS (HTTP Live Streaming) for its browser compatibility
and DVR support. However, I am encountering issues with audio-video
synchronization, managing camera orientation metadata, and format
conversions.



Here are my attempts :


- 

-
MP4 segmentation with
MediaRecorder


- 

- I used
MediaRecorder
withsetNextOutputFile
to generate short MP4 segments, thenffmpeg-kit
to convert them to fMP4 for HLS. - Expected : Well-aligned segments for smooth HLS playback.
- Result : Timestamp issues causing jumps or interruptions in playback.








- I used
-
MPEG2-TS via local socket


- 

- I configured
MediaRecorder
to produce an MPEG2-TS stream sent via a local socket toffmpeg-kit
. - Expected : Stable streaming with preserved metadata.
- Result : Streaming works, but orientation metadata is lost, leading to incorrectly oriented video (e.g., rotated 90°).








- I configured
-
Orientation correction with
ffmpeg


- 

- I tested
-vf transpose=1
inffmpeg
to correct the orientation. - Expected : Correctly oriented video without excessive latency.
- Result : Re-encoding takes too long for real-time streaming, causing unacceptable latency.








- I tested
-
MPEG2-TS to fMP4 conversion


- 

- I converted the MPEG2-TS stream to fMP4 with
ffmpeg
to preserve orientation. - Expected : Perfect audio-video synchronization.
- Result : Slight desynchronization between audio and video, affecting the user experience.








- I converted the MPEG2-TS stream to fMP4 with










I am looking for a solution to :


- 

- Stream an HLS feed from Android with correctly timestamped segments.
- Preserve orientation metadata without heavy re-encoding.
- Ensure perfect audio-video synchronization.








UPDATE


package com.example.angegardien

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.SurfaceTexture
import android.hardware.camera2.*
import android.media.*
import android.os.*
import android.util.Log
import android.view.Surface
import android.view.TextureView
import android.view.WindowManager
import androidx.activity.ComponentActivity
import androidx.core.app.ActivityCompat
import com.arthenica.ffmpegkit.FFmpegKit
import fi.iki.elonen.NanoHTTPD
import kotlinx.coroutines.*
import java.io.File
import java.io.IOException
import java.net.ServerSocket
import android.view.OrientationEventListener

/**
 * MainActivity class:
 * - Manages camera operations using the Camera2 API.
 * - Records video using MediaRecorder.
 * - Pipes data to FFmpeg to generate HLS segments.
 * - Hosts a local HLS server using NanoHTTPD to serve the generated HLS content.
 */
class MainActivity : ComponentActivity() {

 // TextureView used for displaying the camera preview.
 private lateinit var textureView: TextureView
 // Camera device instance.
 private lateinit var cameraDevice: CameraDevice
 // Camera capture session for managing capture requests.
 private lateinit var cameraCaptureSession: CameraCaptureSession
 // CameraManager to access camera devices.
 private lateinit var cameraManager: CameraManager
 // Directory where HLS output files will be stored.
 private lateinit var hlsDir: File
 // Instance of the HLS server.
 private lateinit var hlsServer: HlsServer

 // Camera id ("1" corresponds to the rear camera).
 private val cameraId = "1"
 // Flag indicating whether recording is currently active.
 private var isRecording = false

 // MediaRecorder used for capturing audio and video.
 private lateinit var activeRecorder: MediaRecorder
 // Surface for the camera preview.
 private lateinit var previewSurface: Surface
 // Surface provided by MediaRecorder for recording.
 private lateinit var recorderSurface: Surface

 // Port for the FFmpeg local socket connection.
 private val ffmpegPort = 8080

 // Coroutine scope to manage asynchronous tasks.
 private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())

 // Variables to track current device rotation and listen for orientation changes.
 private var currentRotation = 0
 private lateinit var orientationListener: OrientationEventListener

 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)

 // Initialize the TextureView and set it as the content view.
 textureView = TextureView(this)
 setContentView(textureView)

 // Get the CameraManager system service.
 cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
 // Setup the directory for HLS output.
 setupHLSDirectory()

 // Start the local HLS server on port 8081.
 hlsServer = HlsServer(8081, hlsDir, this)
 try {
 hlsServer.start()
 Log.d("HLS_SERVER", "HLS Server started on port 8081")
 } catch (e: IOException) {
 Log.e("HLS_SERVER", "Error starting HLS Server", e)
 }

 // Initialize the current rotation.
 currentRotation = getDeviceRotation()

 // Add a listener to detect orientation changes.
 orientationListener = object : OrientationEventListener(this) {
 override fun onOrientationChanged(orientation: Int) {
 if (orientation == ORIENTATION_UNKNOWN) return // Skip unknown orientations.
 // Determine the new rotation angle.
 val newRotation = when {
 orientation >= 315 || orientation < 45 -> 0
 orientation >= 45 && orientation < 135 -> 90
 orientation >= 135 && orientation < 225 -> 180
 orientation >= 225 && orientation < 315 -> 270
 else -> 0
 }
 // If the rotation has changed and recording is active, update the rotation.
 if (newRotation != currentRotation && isRecording) {
 Log.d("ROTATION", "Orientation change detected: $newRotation")
 currentRotation = newRotation
 }
 }
 }
 orientationListener.enable()

 // Set up the TextureView listener to know when the surface is available.
 textureView.surfaceTextureListener = object : TextureView.SurfaceTextureListener {
 override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
 // Open the camera when the texture becomes available.
 openCamera()
 }
 override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {}
 override fun onSurfaceTextureDestroyed(surface: SurfaceTexture) = false
 override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {}
 }
 }

 /**
 * Sets up the HLS directory in the public Downloads folder.
 * If the directory exists, it deletes it recursively and creates a new one.
 */
 private fun setupHLSDirectory() {
 val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
 hlsDir = File(downloadsDir, "HLS_Output")

 if (hlsDir.exists()) {
 hlsDir.deleteRecursively()
 }
 hlsDir.mkdirs()

 Log.d("HLS", "📂 HLS folder created: ${hlsDir.absolutePath}")
 }

 /**
 * Opens the camera after checking for necessary permissions.
 */
 private fun openCamera() {
 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||
 ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
 // Request permissions if they are not already granted.
 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO), 101)
 return
 }

 try {
 // Open the specified camera using its cameraId.
 cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
 override fun onOpened(camera: CameraDevice) {
 cameraDevice = camera
 // Start the recording session once the camera is opened.
 startNextRecording()
 }
 override fun onDisconnected(camera: CameraDevice) { camera.close() }
 override fun onError(camera: CameraDevice, error: Int) { camera.close() }
 }, null)
 } catch (e: CameraAccessException) {
 e.printStackTrace()
 }
 }

 /**
 * Starts a new recording session:
 * - Sets up the preview and recorder surfaces.
 * - Creates a pipe for MediaRecorder output.
 * - Creates a capture session for simultaneous preview and recording.
 */
 private fun startNextRecording() {
 // Get the SurfaceTexture from the TextureView and set its default buffer size.
 val texture = textureView.surfaceTexture!!
 texture.setDefaultBufferSize(1920, 1080)
 // Create the preview surface.
 previewSurface = Surface(texture)

 // Create and configure the MediaRecorder.
 activeRecorder = createMediaRecorder()

 // Create a pipe to route MediaRecorder data.
 val pipe = ParcelFileDescriptor.createPipe()
 val pfdWrite = pipe[1] // Write end used by MediaRecorder.
 val pfdRead = pipe[0] // Read end used by the local socket server.

 // Set MediaRecorder output to the file descriptor of the write end.
 activeRecorder.setOutputFile(pfdWrite.fileDescriptor)
 setupMediaRecorder(activeRecorder)
 // Obtain the recorder surface from MediaRecorder.
 recorderSurface = activeRecorder.surface

 // Create a capture request using the RECORD template.
 val captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
 captureRequestBuilder.addTarget(previewSurface)
 captureRequestBuilder.addTarget(recorderSurface)

 // Create a capture session including both preview and recorder surfaces.
 cameraDevice.createCaptureSession(
 listOf(previewSurface, recorderSurface),
 object : CameraCaptureSession.StateCallback() {
 override fun onConfigured(session: CameraCaptureSession) {
 cameraCaptureSession = session
 captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO)
 // Start a continuous capture request.
 cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null)

 // Launch a coroutine to start FFmpeg and MediaRecorder with synchronization.
 scope.launch {
 startFFmpeg()
 delay(500) // Wait for FFmpeg to be ready.
 activeRecorder.start()
 isRecording = true
 Log.d("HLS", "🎥 Recording started...")
 }

 // Launch a coroutine to run the local socket server to forward data.
 scope.launch {
 startLocalSocketServer(pfdRead)
 }
 }
 override fun onConfigureFailed(session: CameraCaptureSession) {
 Log.e("Camera2", "❌ Configuration failed")
 }
 },
 null
 )
 }

 /**
 * Coroutine to start a local socket server.
 * It reads from the MediaRecorder pipe and sends the data to FFmpeg.
 */
 private suspend fun startLocalSocketServer(pfdRead: ParcelFileDescriptor) {
 withContext(Dispatchers.IO) {
 val serverSocket = ServerSocket(ffmpegPort)
 Log.d("HLS", "Local socket server started on port $ffmpegPort")

 // Accept connection from FFmpeg.
 val socket = serverSocket.accept()
 Log.d("HLS", "Connection accepted from FFmpeg")

 // Read data from the pipe and forward it through the socket.
 val inputStream = ParcelFileDescriptor.AutoCloseInputStream(pfdRead)
 val outputStream = socket.getOutputStream()
 val buffer = ByteArray(8192)
 var bytesRead: Int
 while (inputStream.read(buffer).also { bytesRead = it } != -1) {
 outputStream.write(buffer, 0, bytesRead)
 }
 outputStream.close()
 inputStream.close()
 socket.close()
 serverSocket.close()
 }
 }

 /**
 * Coroutine to start FFmpeg using a local TCP input.
 * Applies a video rotation filter based on device orientation and generates HLS segments.
 */
 private suspend fun startFFmpeg() {
 withContext(Dispatchers.IO) {
 // Retrieve the appropriate transpose filter based on current rotation.
 val transposeFilter = getTransposeFilter(currentRotation)

 // FFmpeg command to read from the TCP socket and generate an HLS stream.
 // Two alternative commands are commented below.
 // val ffmpegCommand = "-fflags +genpts -i tcp://localhost:$ffmpegPort -c copy -bsf:a aac_adtstoasc -movflags +faststart -f dash -seg_duration 10 -hls_playlist 1 ${hlsDir.absolutePath}/manifest.mpd"
 // val ffmpegCommand = "-fflags +genpts -i tcp://localhost:$ffmpegPort -c copy -bsf:a aac_adtstoasc -movflags +faststart -f hls -hls_time 5 -hls_segment_type fmp4 -hls_flags split_by_time -hls_list_size 0 -hls_playlist_type event -hls_fmp4_init_filename init.mp4 -hls_segment_filename ${hlsDir.absolutePath}/segment_%03d.m4s ${hlsDir.absolutePath}/playlist.m3u8"
 val ffmpegCommand = "-fflags +genpts -i tcp://localhost:$ffmpegPort -vf $transposeFilter -c:v libx264 -preset ultrafast -crf 23 -c:a copy -movflags +faststart -f hls -hls_time 0.1 -hls_segment_type mpegts -hls_flags split_by_time -hls_list_size 0 -hls_playlist_type event -hls_segment_filename ${hlsDir.absolutePath}/segment_%03d.ts ${hlsDir.absolutePath}/playlist.m3u8"

 FFmpegKit.executeAsync(ffmpegCommand) { session ->
 if (session.returnCode.isValueSuccess) {
 Log.d("HLS", "✅ HLS generated successfully")
 } else {
 Log.e("FFmpeg", "❌ Error generating HLS: ${session.allLogsAsString}")
 }
 }
 }
 }

 /**
 * Gets the current device rotation using the WindowManager.
 */
 private fun getDeviceRotation(): Int {
 val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
 return when (windowManager.defaultDisplay.rotation) {
 Surface.ROTATION_0 -> 0
 Surface.ROTATION_90 -> 90
 Surface.ROTATION_180 -> 180
 Surface.ROTATION_270 -> 270
 else -> 0
 }
 }

 /**
 * Returns the FFmpeg transpose filter based on the rotation angle.
 * Used to rotate the video stream accordingly.
 */
 private fun getTransposeFilter(rotation: Int): String {
 return when (rotation) {
 90 -> "transpose=1" // 90° clockwise
 180 -> "transpose=2,transpose=2" // 180° rotation
 270 -> "transpose=2" // 90° counter-clockwise
 else -> "transpose=0" // No rotation
 }
 }

 /**
 * Creates and configures a MediaRecorder instance.
 * Sets up audio and video sources, formats, encoders, and bitrates.
 */
 private fun createMediaRecorder(): MediaRecorder {
 return MediaRecorder().apply {
 setAudioSource(MediaRecorder.AudioSource.MIC)
 setVideoSource(MediaRecorder.VideoSource.SURFACE)
 setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
 setVideoEncodingBitRate(5000000)
 setVideoFrameRate(24)
 setVideoSize(1080, 720)
 setVideoEncoder(MediaRecorder.VideoEncoder.H264)
 setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
 setAudioSamplingRate(16000)
 setAudioEncodingBitRate(96000) // 96 kbps
 }
 }

 /**
 * Prepares the MediaRecorder and logs the outcome.
 */
 private fun setupMediaRecorder(recorder: MediaRecorder) {
 try {
 recorder.prepare()
 Log.d("HLS", "✅ MediaRecorder prepared")
 } catch (e: IOException) {
 Log.e("HLS", "❌ Error preparing MediaRecorder", e)
 }
 }

 /**
 * Custom HLS server class extending NanoHTTPD.
 * Serves HLS segments and playlists from the designated HLS directory.
 */
 private inner class HlsServer(port: Int, private val hlsDir: File, private val context: Context) : NanoHTTPD(port) {
 override fun serve(session: IHTTPSession): Response {
 val uri = session.uri.trimStart('/')

 // Intercept the request for `init.mp4` and serve it from assets.
 /*
 if (uri == "init.mp4") {
 Log.d("HLS Server", "📡 Intercepting init.mp4, sending file from assets...")
 return try {
 val assetManager = context.assets
 val inputStream = assetManager.open("init.mp4")
 newFixedLengthResponse(Response.Status.OK, "video/mp4", inputStream, inputStream.available().toLong())
 } catch (e: Exception) {
 Log.e("HLS Server", "❌ Error reading init.mp4 from assets: ${e.message}")
 newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Server error")
 }
 }
 */

 // Serve all other HLS files normally from the hlsDir.
 val file = File(hlsDir, uri)
 return if (file.exists()) {
 newFixedLengthResponse(Response.Status.OK, getMimeTypeForFile(uri), file.inputStream(), file.length())
 } else {
 newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "File not found")
 }
 }
 }

 /**
 * Clean up resources when the activity is destroyed.
 * Stops recording, releases the camera, cancels coroutines, and stops the HLS server.
 */
 override fun onDestroy() {
 super.onDestroy()
 if (isRecording) {
 activeRecorder.stop()
 activeRecorder.release()
 }
 cameraDevice.close()
 scope.cancel()
 hlsServer.stop()
 orientationListener.disable()
 Log.d("HLS", "🛑 Activity destroyed")
 }
}



I have three examples of ffmpeg commands.


- 

- One command segments into DASH, but the camera does not have the correct rotation.
- One command segments into HLS without re-encoding with 5-second segments ; it’s fast but does not have the correct rotation.
- One command segments into HLS with re-encoding, which applies a rotation. It’s too slow for 5-second segments, so a 1-second segment was chosen.








Note :


- 

- In the second command ("One command segments into HLS without re-encoding with 5-second segments ; it’s fast but does not have the correct rotation."), it returns fMP4. To achieve the correct rotation, I provide a preconfigured
init.mp4
file during the HTTP request to retrieve it (see comment). - In the third command ("One command segments into HLS with re-encoding, which applies a rotation. It’s too slow for 5-second segments, so a 1-second segment was chosen."), it returns TS.






-
-
FFMPEG & ytdl-core | Muxing highestaudio and highestvideo results in mp4 with incorrect time
17 mars 2023, par Niek PetersI want to combine a file with only video and a file with only audio from the ytdl-core package into a mp4 and stream it in the response. I get the files using the
highestvideo
andhighestaudio
quality settings. I tried to modify a part of the ytdl-core-muxer module to change the output format to mp4, for which I also needed to add-movflags frag_keyframe+empty_moov
, to allow the output mp4 to be seekable. This all seems to work and it produces a mp4 file without errors. When I open it with the Windows Photos app however, I noticed that even though video plays normally in perfect quality, the time is completely wrong.



I have tried adding a fixed framerate with
-r 60
and regenerating the timestamps with-fflags +genpts
, but to no avail. I have also tried encoding the video and audio formats toh264
(usinglibx264
) andacc
, but that didn't solve it either.



// create the ffmpeg process for muxing
const ffmpegProcess = cp.spawn(
 ffmpeg,
 [
 // input audio by pipe
 "-thread_queue_size", "4096",
 "-i", "pipe:3",

 // input video by pipe
 "-thread_queue_size", "4096",
 "-r", "60",
 "-i", "pipe:4",

 // map audio and video correspondingly
 "-map", "0:a",
 "-map", "1:v",

 // change the codec
 "-c:v", "libx264", 
 "-c:a", "aac",
 
 "-preset", "ultrafast",

 // Allow output to be seekable, which is needed for mp4 output
 "-movflags", "frag_keyframe+empty_moov",

 // output mp4 and pipe
 "-r", "60",
 "-fflags", "+genpts",
 "-f", "mp4", "pipe:5",
 ],
 {
 // no popup window for Windows users
 windowsHide: true,
 stdio: [
 // silence stdin/out, forward stderr,
 "inherit", "inherit", "inherit",
 // and pipe audio, video, output
 "pipe", "pipe", "pipe",
 ],
 }
);
audioStream.pipe(ffmpegProcess.stdio[3]);
videoStream.pipe(ffmpegProcess.stdio[4]);
ffmpegProcess.stdio[5].pipe(result);







Full console output :


ffmpeg version 5.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers 
 built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
 configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp 
--enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx 
--enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
 libavutil 57. 17.100 / 57. 17.100
 libavcodec 59. 18.100 / 59. 18.100
 libavformat 59. 16.100 / 59. 16.100
 libavdevice 59. 4.100 / 59. 4.100
 libavfilter 8. 24.100 / 8. 24.100
 libswscale 6. 4.100 / 6. 4.100
 libswresample 4. 3.100 / 4. 3.100
 libpostproc 56. 3.100 / 56. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pipe:3':
 Metadata:
 major_brand : mp42
 minor_version : 0
 compatible_brands: isommp42
 creation_time : 2022-08-21T19:56:49.000000Z
 Duration: 00:01:32.11, start: 0.000000, bitrate: N/A
 Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 1892 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
 Metadata:
 creation_time : 2022-08-21T19:56:49.000000Z
 handler_name : ISO Media file produced by Google Inc. Created on: 08/21/2022.
 vendor_id : [0][0][0][0]
 Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default) Metadata:
 creation_time : 2022-08-21T19:56:49.000000Z
 handler_name : ISO Media file produced by Google Inc. Created on: 08/21/2022.
 vendor_id : [0][0][0][0]
Input #1, matroska,webm, from 'pipe:4':
 Metadata:
 encoder : google/video-file
 Duration: 00:01:32.12, start: 0.000000, bitrate: N/A
 Stream #1:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 3840x2160, SAR 1:1 DAR 16:9, 60 fps, 60 
tbr, 1k tbn (default)
Stream mapping:
 Stream #0:1 -> #0:0 (aac (native) -> aac (native))
 Stream #1:0 -> #0:1 (vp9 (native) -> h264 (libx264))
[libx264 @ 0000022aa059be80] using SAR=1/1
[libx264 @ 0000022aa059be80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 
[libx264 @ 0000022aa059be80] profile Constrained Baseline, level 5.2, 4:2:0, 8-bit
[libx264 @ 0000022aa059be80] 264 - core 164 r3094 bfc87b7 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 
- http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
Output #0, mp4, to 'pipe:5':
 Metadata:
 major_brand : mp42
 minor_version : 0
 compatible_brands: isommp42
 encoder : Lavf59.16.100
 Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default) 
 Metadata:
 creation_time : 2022-08-21T19:56:49.000000Z
 handler_name : ISO Media file produced by Google Inc. Created on: 08/21/2022.
 vendor_id : [0][0][0][0]
 encoder : Lavc59.18.100 aac
 Stream #0:1(eng): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 60 fps, 15360 tbn (default)
 Metadata:
 encoder : Lavc59.18.100 libx264
 Side data:
 cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[matroska,webm @ 0000022aa056cd00] Thread message queue blocking; consider raising the thread_queue_size option (current value: 4096)
frame= 5527 fps= 77 q=-1.0 Lsize= 424599kB time=00:01:32.11 bitrate=37761.2kbits/s speed=1.29x 
video:423226kB audio:1329kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.010570%[aac @ 0000022aa05ca240] Qavg: 17828.035
[libx264 @ 0000022aa059be80] frame I:23 Avg QP:19.83 size:292044
[libx264 @ 0000022aa059be80] frame P:5504 Avg QP:22.92 size: 77519
[libx264 @ 0000022aa059be80] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0000022aa059be80] mb P I16..4: 26.5% 0.0% 0.0% P16..4: 14.1% 0.0% 0.0% 0.0% 0.0% skip:59.3%
[libx264 @ 0000022aa059be80] coded y,uvDC,uvAC intra: 10.6% 27.6% 7.0% inter: 6.5% 12.8% 1.4%
[libx264 @ 0000022aa059be80] i16 v,h,dc,p: 57% 26% 8% 9%
[libx264 @ 0000022aa059be80] i8c dc,h,v,p: 43% 24% 25% 7%
[libx264 @ 0000022aa059be80] kb/s:37637.70