Score:2

How can I convert my webm screencast to mp4?

vn flag

Gnome has a built-in screencast tool using ctrl plus shift plus alt plus R. It's a great tool with consistent quality video output!

But, I need the output in mp4. I have tried this: ffmpeg -i screencast.webm -crf 0 screencast.mp4 as specified in other AskUbuntu posts, but it doesn't work well for me, even though it's supposed to be lossless.

My screencast in mp4 jumps around, freezes on a single frame, and the file sizes are drastically different.

I need h.264 mp4, ideally with a constant frame rate, at high definition.

What ffmpeg command can I use?

Here's an example file: ffmpeg -i input.webm

$ ffmpeg -i Screencast\ from\ 03-18-2023\ 04\:57\:59\ PM.webm 
ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --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-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --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 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --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-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --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 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc --enable-libsmbclient
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, matroska,webm, from 'Screencast from 03-18-2023 04:57:59 PM.webm':
  Metadata:
    encoder         : GStreamer matroskamux version 1.20.3
    creation_time   : 2023-03-18T20:57:59.129336Z
  Duration: 00:16:48.47, start: 0.028000, bitrate: 858 kb/s
  Stream #0:0(eng): Video: vp8, yuv420p(tv, bt709, progressive), 1920x1080, SAR 1:1 DAR 16:9, 1k tbr, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
At least one output file must be specified

andrew.46 avatar
in flag
Can you post the command itself and subsequent full terminal output for this command: `ffmpeg -i screencast.webm` and then it should be a simple matter to suggest the appropriate FFmpeg command...
Costa Michailidis avatar
vn flag
Updated! Thanks : )
andrew.46 avatar
in flag
Interestingly enough a VP8 video stream should be ok in an mp4 container so only *remuxing* is required: `ffmpeg -i input.webm -c:v copy output.mp4` Support for VP8/9 in mp4 has been around a while but just check that your copy of FFmpeg is new enough to do this and that your playback application is also happy...
Costa Michailidis avatar
vn flag
And what happens to frame rates? It's variable in webm, and I'd need constant in mp4, no?
andrew.46 avatar
in flag
I don't know. I would recommend a test run and see if FFmpeg will sort it out for you :). On a test encode here on my local machine there were no issues but best to test on your own setup...
cn flag
The frame rate is precisely one issue. There's no frame rate specified in the default `[Screencast*].webm` and `Video Scan Type` comes across as *Unknown (2)* on my `22.04` setup. `ffmpeg` works when setting frame rate explicitly: `ffmpeg -i screencast.webm -filter:v "fps=30" screencast.mp4` I've added more detail and options in my answer to this Q. Thank you, @andrew.46
Score:4
cn flag

This works to output your screencast as an mp4 that plays as expected in VLC and others:

ffmpeg -i screencast.webm -filter:v "fps=30" screencast.mp4

This works in more cases and avoids ffmpeg throwing 'not divisible by 2' errors:

ffmpeg -i screencast.webm -filter:v "scale=trunc(iw/2)*2:trunc(ih/2)*2,fps=30" screencast.mp4

The above sets a constant frame rate of 30 frames per second (fps). It resizes your video by one pixel at most and makes sure your input width and height (iw and ih) are even numbers.

You can also specify codec options like -codec:v libx264. Check out ffmpeg's Video Options for your particulars.

Your questions and related Q&A I've found helpful during this research include these:

I sit in a Tesla and translated this thread with Ai:

mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.