Recherche avancée

Médias (2)

Mot : - Tags -/documentation

Autres articles (77)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-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

  • List of compatible distributions

    26 avril 2011, par

    The table below is the list of Linux distributions compatible with the automated installation script of MediaSPIP. Distribution nameVersion nameVersion number Debian Squeeze 6.x.x Debian Weezy 7.x.x Debian Jessie 8.x.x Ubuntu The Precise Pangolin 12.04 LTS Ubuntu The Trusty Tahr 14.04
    If you want to help us improve this list, you can provide us access to a machine whose distribution is not mentioned above or send the necessary fixes to add (...)

Sur d’autres sites (7937)

  • Why does my script return 0 when it fails ? Bash, Whisper, ffmpeg

    30 avril 2024, par d-b

    I have a bash script that executes whisper on all sound files in a directory. Whisper uses ffmpeg to decode sound files to a format it can handle. One of the files in the directory was corrupt and caused ffmpeg to fail. The first time I executed my script it returned 1 when it hit that file but when I try to reproduce the error it always returns 0.

    


    Here is the log from the first run when 1 was returned :

    


    Traceback (most recent call last):&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/audio.py", line 48, in load_audio&#xA;    .run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True)&#xA;     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/ffmpeg/_run.py", line 325, in run&#xA;    raise Error(&#x27;ffmpeg&#x27;, out, err)&#xA;ffmpeg._run.Error: ffmpeg error (see stderr output for detail)&#xA;&#xA;The above exception was the direct cause of the following exception:&#xA;&#xA;Traceback (most recent call last):&#xA;  File "/Users/db/Library/Python/3.11/bin/whisper", line 8, in <module>&#xA;    sys.exit(cli())&#xA;             ^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/transcribe.py", line 437, in cli&#xA;    result = transcribe(model, audio_path, temperature=temperature, **args)&#xA;             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/transcribe.py", line 121, in transcribe&#xA;    mel = log_mel_spectrogram(audio, padding=N_SAMPLES)&#xA;          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/audio.py", line 130, in log_mel_spectrogram&#xA;    audio = load_audio(audio)&#xA;            ^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/audio.py", line 51, in load_audio&#xA;    raise RuntimeError(f"Failed to load audio: {e.stderr.decode()}") from e&#xA;RuntimeError: Failed to load audio: ffmpeg version 4.4.4 Copyright (c) 2000-2023 the FFmpeg developers&#xA;  built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)&#xA;  configuration: --prefix=/opt/local --cc=/usr/bin/clang --mandir=/opt/local/share/man --enable-audiotoolbox --disable-indev=jack --disable-libjack --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --enable-opencl --disable-outdev=xv --enable-sdl2 --disable-securetransport --enable-videotoolbox --enable-avfilter --enable-avresample --enable-fontconfig --enable-gnutls --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libfribidi --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libzvbi --enable-lzma --enable-pthreads --enable-shared --enable-swscale --enable-zlib --enable-libaom --enable-libsvtav1 --arch=x86_64 --enable-x86asm --enable-gpl --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-postproc&#xA;  libavutil      56. 70.100 / 56. 70.100&#xA;  libavcodec     58.134.100 / 58.134.100&#xA;  libavformat    58. 76.100 / 58. 76.100&#xA;  libavdevice    58. 13.100 / 58. 13.100&#xA;  libavfilter     7.110.100 /  7.110.100&#xA;  libavresample   4.  0.  0 /  4.  0.  0&#xA;  libswscale      5.  9.100 /  5.  9.100&#xA;  libswresample   3.  9.100 /  3.  9.100&#xA;  libpostproc    55.  9.100 / 55.  9.100&#xA;/soundfile1.opus: Invalid data found when processing input&#xA;&#xA;&#xA;exit: 1 //this is my own output&#xA;</module>

    &#xA;

    and here is an example of when it returns 0 despite the input file is corrupt :

    &#xA;

    % whisper soundfile1.opus&#xA;&#xA;Traceback (most recent call last):&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/audio.py", line 58, in load_audio&#xA;    out = run(cmd, capture_output=True, check=True).stdout&#xA;          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&#xA;  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/subprocess.py", line 571, in run&#xA;    raise CalledProcessError(retcode, process.args,&#xA;subprocess.CalledProcessError: Command &#x27;[&#x27;ffmpeg&#x27;, &#x27;-nostdin&#x27;, &#x27;-threads&#x27;, &#x27;0&#x27;, &#x27;-i&#x27;, &#x27;soundfile1.opus&#x27;, &#x27;-f&#x27;, &#x27;s16le&#x27;, &#x27;-ac&#x27;, &#x27;1&#x27;, &#x27;-acodec&#x27;, &#x27;pcm_s16le&#x27;, &#x27;-ar&#x27;, &#x27;16000&#x27;, &#x27;-&#x27;]&#x27; returned non-zero exit status 1.&#xA;&#xA;The above exception was the direct cause of the following exception:&#xA;&#xA;Traceback (most recent call last):&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/transcribe.py", line 597, in cli&#xA;    result = transcribe(model, audio_path, temperature=temperature, **args)&#xA;             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/transcribe.py", line 133, in transcribe&#xA;    mel = log_mel_spectrogram(audio, model.dims.n_mels, padding=N_SAMPLES)&#xA;          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/audio.py", line 140, in log_mel_spectrogram&#xA;    audio = load_audio(audio)&#xA;            ^^^^^^^^^^^^^^^^^&#xA;  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/audio.py", line 60, in load_audio&#xA;    raise RuntimeError(f"Failed to load audio: {e.stderr.decode()}") from e&#xA;RuntimeError: Failed to load audio: ffmpeg version 4.4.4 Copyright (c) 2000-2023 the FFmpeg developers&#xA;  built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)&#xA;  configuration: --prefix=/opt/local --cc=/usr/bin/clang --mandir=/opt/local/share/man --enable-audiotoolbox --disable-indev=jack --disable-libjack --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --enable-opencl --disable-outdev=xv --enable-sdl2 --disable-securetransport --enable-videotoolbox --enable-avfilter --enable-avresample --enable-fontconfig --enable-gnutls --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libfribidi --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libzvbi --enable-lzma --enable-pthreads --enable-shared --enable-swscale --enable-zlib --enable-libaom --enable-libsvtav1 --arch=x86_64 --enable-x86asm --enable-gpl --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-postproc&#xA;  libavutil      56. 70.100 / 56. 70.100&#xA;  libavcodec     58.134.100 / 58.134.100&#xA;  libavformat    58. 76.100 / 58. 76.100&#xA;  libavdevice    58. 13.100 / 58. 13.100&#xA;  libavfilter     7.110.100 /  7.110.100&#xA;  libavresample   4.  0.  0 /  4.  0.  0&#xA;  libswscale      5.  9.100 /  5.  9.100&#xA;  libswresample   3.  9.100 /  3.  9.100&#xA;  libpostproc    55.  9.100 / 55.  9.100&#xA;soundfile1.opus: Invalid data found when processing input&#xA;&#xA;Skipping soundfile1.opus due to RuntimeError: Failed to load audio: ffmpeg version 4.4.4 Copyright (c) 2000-2023 the FFmpeg developers&#xA;  built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)&#xA;  configuration: --prefix=/opt/local --cc=/usr/bin/clang --mandir=/opt/local/share/man --enable-audiotoolbox --disable-indev=jack --disable-libjack --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --enable-opencl --disable-outdev=xv --enable-sdl2 --disable-securetransport --enable-videotoolbox --enable-avfilter --enable-avresample --enable-fontconfig --enable-gnutls --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libfribidi --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libzvbi --enable-lzma --enable-pthreads --enable-shared --enable-swscale --enable-zlib --enable-libaom --enable-libsvtav1 --arch=x86_64 --enable-x86asm --enable-gpl --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-postproc&#xA;  libavutil      56. 70.100 / 56. 70.100&#xA;  libavcodec     58.134.100 / 58.134.100&#xA;  libavformat    58. 76.100 / 58. 76.100&#xA;  libavdevice    58. 13.100 / 58. 13.100&#xA;  libavfilter     7.110.100 /  7.110.100&#xA;  libavresample   4.  0.  0 /  4.  0.  0&#xA;  libswscale      5.  9.100 /  5.  9.100&#xA;  libswresample   3.  9.100 /  3.  9.100&#xA;  libpostproc    55.  9.100 / 55.  9.100&#xA;soundfile1.opus: Invalid data found when processing input&#xA;&#xA;% echo $?&#xA;0&#xA;

    &#xA;

    When I try to reproduce the behaviour I have both tried to execute the script as well as just running the actual line of code from the command prompt. The actual script looks like this :

    &#xA;

    if whisper "$file" >> "${directory}/../${transdir}/${name}.txt"; then&#xA;    whispersuccess=$?&#xA;    echo "exit code $whispersuccess"&#xA;else&#xA;    whispersuccess=$?&#xA;    echo "exit code: $whispersuccess"&#xA;

    &#xA;

    I want it to return ¬0 when something like this happens. How do I achieve this ?

    &#xA;

  • ffmpeg failed to load audio file

    14 avril 2024, par Vaishnav Ghenge
    Failed to load audio: ffmpeg version 5.1.4-0&#x2B;deb12u1 Copyright (c) Failed to load audio: ffmpeg version 5.1.4-0&#x2B;deb12u1 Copyright (c) 2000-2023 the FFmpeg developers&#xA;  built with gcc 12 (Debian 12.2.0-14)&#xA;  configuration: --prefix=/usr --extra-version=0&#x2B;deb12u1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared&#xA;  libavutil      57. 28.100 / 57. 28.100&#xA;  libavcodec     59. 37.100 / 59. 37.100&#xA;  libavformat    59. 27.100 / 59. 27.100&#xA;  libavdevice    59.  7.100 / 59.  7.100&#xA;  libavfilter     8. 44.100 /  8. 44.100&#xA;  libswscale      6.  7.100 /  6.  7.100&#xA;  libswresample   4.  7.100 /  4.  7.100&#xA;  libpostproc    56.  6.100 / 56.  6.100&#xA;/tmp/tmpjlchcpdm.wav: Invalid data found when processing input&#xA;

    &#xA;

    backend :

    &#xA;

    &#xA;@app.route("/transcribe", methods=["POST"])&#xA;def transcribe():&#xA;    # Check if audio file is present in the request&#xA;    if &#x27;audio_file&#x27; not in request.files:&#xA;        return jsonify({"error": "No file part"}), 400&#xA;    &#xA;    audio_file = request.files.get(&#x27;audio_file&#x27;)&#xA;&#xA;    # Check if audio_file is sent in files&#xA;    if not audio_file:&#xA;        return jsonify({"error": "`audio_file` is missing in request.files"}), 400&#xA;&#xA;    # Check if the file is present&#xA;    if audio_file.filename == &#x27;&#x27;:&#xA;        return jsonify({"error": "No selected file"}), 400&#xA;&#xA;    # Save the file with a unique name&#xA;    filename = secure_filename(audio_file.filename)&#xA;    unique_filename = os.path.join("uploads", str(uuid.uuid4()) &#x2B; &#x27;_&#x27; &#x2B; filename)&#xA;    # audio_file.save(unique_filename)&#xA;    &#xA;    # Read the contents of the audio file&#xA;    contents = audio_file.read()&#xA;&#xA;    max_file_size = 500 * 1024 * 1024&#xA;    if len(contents) > max_file_size:&#xA;        return jsonify({"error": "File is too large"}), 400&#xA;&#xA;    # Check if the file extension suggests it&#x27;s a WAV file&#xA;    if not filename.lower().endswith(&#x27;.wav&#x27;):&#xA;        # Delete the file if it&#x27;s not a WAV file&#xA;        os.remove(unique_filename)&#xA;        return jsonify({"error": "Only WAV files are supported"}), 400&#xA;&#xA;    print(f"\033[92m{filename}\033[0m")&#xA;&#xA;    # Call Celery task asynchronously&#xA;    result = transcribe_audio.delay(contents)&#xA;&#xA;    return jsonify({&#xA;        "task_id": result.id,&#xA;        "status": "pending"&#xA;    })&#xA;&#xA;&#xA;@celery_app.task&#xA;def transcribe_audio(contents):&#xA;    # Transcribe the audio&#xA;    try:&#xA;        # Create a temporary file to save the audio data&#xA;        with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_audio:&#xA;            temp_path = temp_audio.name&#xA;            temp_audio.write(contents)&#xA;&#xA;            print(f"\033[92mFile temporary path: {temp_path}\033[0m")&#xA;            transcribe_start_time = time.time()&#xA;&#xA;            # Transcribe the audio&#xA;            transcription = transcribe_with_whisper(temp_path)&#xA;            &#xA;            transcribe_end_time = time.time()&#xA;            print(f"\033[92mTranscripted text: {transcription}\033[0m")&#xA;&#xA;            return transcription, transcribe_end_time - transcribe_start_time&#xA;&#xA;    except Exception as e:&#xA;        print(f"\033[92mError: {e}\033[0m")&#xA;        return str(e)&#xA;

    &#xA;

    frontend :

    &#xA;

        useEffect(() => {&#xA;        const init = () => {&#xA;            navigator.mediaDevices.getUserMedia({audio: true})&#xA;                .then((audioStream) => {&#xA;                    const recorder = new MediaRecorder(audioStream);&#xA;&#xA;                    recorder.ondataavailable = e => {&#xA;                        if (e.data.size > 0) {&#xA;                            setChunks(prevChunks => [...prevChunks, e.data]);&#xA;                        }&#xA;                    };&#xA;&#xA;                    recorder.onerror = (e) => {&#xA;                        console.log("error: ", e);&#xA;                    }&#xA;&#xA;                    recorder.onstart = () => {&#xA;                        console.log("started");&#xA;                    }&#xA;&#xA;                    recorder.start();&#xA;&#xA;                    setStream(audioStream);&#xA;                    setRecorder(recorder);&#xA;                });&#xA;        }&#xA;&#xA;        init();&#xA;&#xA;        return () => {&#xA;            if (recorder &amp;&amp; recorder.state === &#x27;recording&#x27;) {&#xA;                recorder.stop();&#xA;            }&#xA;&#xA;            if (stream) {&#xA;                stream.getTracks().forEach(track => track.stop());&#xA;            }&#xA;        }&#xA;    }, []);&#xA;&#xA;    useEffect(() => {&#xA;        // Send chunks of audio data to the backend at regular intervals&#xA;        const intervalId = setInterval(() => {&#xA;            if (recorder &amp;&amp; recorder.state === &#x27;recording&#x27;) {&#xA;                recorder.requestData(); // Trigger data available event&#xA;            }&#xA;        }, 8000); // Adjust the interval as needed&#xA;&#xA;&#xA;        return () => {&#xA;            if (intervalId) {&#xA;                console.log("Interval cleared");&#xA;                clearInterval(intervalId);&#xA;            }&#xA;        };&#xA;    }, [recorder]);&#xA;&#xA;    useEffect(() => {&#xA;        const processAudio = async () => {&#xA;            if (chunks.length > 0) {&#xA;                // Send the latest chunk to the server for transcription&#xA;                const latestChunk = chunks[chunks.length - 1];&#xA;&#xA;                const audioBlob = new Blob([latestChunk]);&#xA;                convertBlobToAudioFile(audioBlob);&#xA;            }&#xA;        };&#xA;&#xA;        void processAudio();&#xA;    }, [chunks]);&#xA;&#xA;    const convertBlobToAudioFile = useCallback((blob: Blob) => {&#xA;        // Convert Blob to audio file (e.g., WAV)&#xA;        // This conversion may require using a third-party library or service&#xA;        // For example, you can use the MediaRecorder API to record audio in WAV format directly&#xA;        // Alternatively, you can use a library like recorderjs to perform the conversion&#xA;        // Here&#x27;s a simplified example using recorderjs:&#xA;&#xA;        const reader = new FileReader();&#xA;        reader.onload = () => {&#xA;            const audioBuffer = reader.result; // ArrayBuffer containing audio data&#xA;&#xA;            // Send audioBuffer to Flask server or perform further processing&#xA;            sendAudioToFlask(audioBuffer as ArrayBuffer);&#xA;        };&#xA;&#xA;        reader.readAsArrayBuffer(blob);&#xA;    }, []);&#xA;&#xA;    const sendAudioToFlask = useCallback((audioBuffer: ArrayBuffer) => {&#xA;        const formData = new FormData();&#xA;        formData.append(&#x27;audio_file&#x27;, new Blob([audioBuffer]), `speech_audio.wav`);&#xA;&#xA;        console.log(formData.get("audio_file"));&#xA;&#xA;        fetch(&#x27;http://34.87.75.138:8000/transcribe&#x27;, {&#xA;            method: &#x27;POST&#x27;,&#xA;            body: formData&#xA;        })&#xA;            .then(response => response.json())&#xA;            .then((data: { task_id: string, status: string }) => {&#xA;                pendingTaskIdsRef.current.push(data.task_id);&#xA;            })&#xA;            .catch(error => {&#xA;                console.error(&#x27;Error sending audio to Flask server:&#x27;, error);&#xA;            });&#xA;    }, []);&#xA;

    &#xA;

    I was trying to pass the audio from frontend to whisper model which is in flask app

    &#xA;

  • How to transcode to another video parameters ? [on hold]

    23 mai 2014, par user3668381

    Google, man pages and any docs I found didn t shown anything relevant so...

    I want to be able to concatene video with ffmpeg, this part is simple, but fail (freeze or massive frame dropping) if the videos don t have the same properties.

    But for now, I didn t found anything else but trying to set a lot of options, expecting to get the good properties... But when they aren t rounded down (or up), you just can t set them (tbr, tbn...).

    So my question is, is there any hidden option in ffmpeg to take the properties of another video (so -copy won t work) as the properties of the transcode.

    Illustration :

    This is the video from which I wan t to copy the parameters :

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cdr.mp4':
     Metadata:
       major_brand     : isom
       minor_version   : 512
       compatible_brands: isomiso2avc1mp41
       creation_time   : 2013-07-04 11:04:27
       encoder         : Lavf54.11.100
     Duration: 00:06:26.96, start: 0.000000, bitrate: 804 kb/s
       Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1280:1281 DAR 16:9], 753 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
       Metadata:
         creation_time   : 2013-07-04 11:04:27
         handler_name    : VideoHandler
       Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 44 kb/s (default)
       Metadata:
         creation_time   : 2013-07-04 11:04:27
         handler_name    : SoundHandler
    At least one output file must be specified

    For now, my command is ffmpeg -i video.mp4 -c:v h264 -c:a libfdk_aac -aspect 16:9 -b:v 753k -b:a 44k output.mp4

    But it turn out that output.mp4 reveal :

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
     Metadata:
       major_brand     : isom
       minor_version   : 512
       compatible_brands: isomiso2avc1mp41
       encoder         : Lavf55.21.100
     Duration: 00:00:07.11, start: 0.046440, bitrate: 685 kb/s
       Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1280:1281 DAR 16:9], 637 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)
       Metadata:
         handler_name    : VideoHandler
       Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 45 kb/s (default)
       Metadata:
         handler_name    : SoundHandler
    At least one output file must be specified

    As we can see, audio bitrate is rounded, tbn is off the chart, general bitrate isn t the same and on and on and on...

    Is there any better way but to add options again and again and hope that nothing will be rounded ? Something like ffmpeg -i video.mp4 -use_properties_of model.mp4 output.mp4 ?