16

I want to convert an elementary stream(.264) to container format(.mp4). Can someone please help me on this? How can I use ffmpeg to do this task? What are all the other methods that could accomplish the same task?

AlwaysTalkingAboutMyDog
  • 3,703
  • 2
  • 25
  • 38
user280527
  • 161
  • 1
  • 1
  • 3

3 Answers3

31

This is easy with ffmpeg:

ffmpeg -framerate 24 -i input.264 -c copy output.mp4
  • This simply stream copies (re-muxes) the video so there is no unnecessary re-encoding occurring; therefore the quality is preserved and the whole process is quick.

  • Frame rate is by default assumed to be 25. You can change this with the -framerate input option. Typical values are 30000/1001, 25 (default), 24000/1001, 24, or frame rate aliases such as ntsc, ntsc-film, or pal.

  • If you don't know the frame rate, you can perform the conversion using your best guess as to the frame rate, and then compare the running duration of the output file with the input file running duration and then calculate the actual frame rate. e.g. assume 24 fps and actual running time of 1:00:00 (60 mins) if resulting file has running time of 1:02:30 (62.5 mins) then actual frame rate is 25 fps (24 * 62.5 / 60)

wheeled
  • 3
  • 2
llogan
  • 11,518
  • 43
  • 54
  • 1
    One should note that raw H.264 streams don't carry a rate information, so FFmpeg will display a warning and default to 25 frames/second. If you want a different frame rate you can use the `-r` switch, e. g. `-r 30` for 30 frames/second. – David Foerster Apr 21 '17 at 12:58
  • 1
    @DavidFoerster Yes, good point, but the H.264 demuxer uses `-framerate` instead of `-r`. – llogan Apr 21 '17 at 18:04
  • You're correct. I should have read the entire paragraph in the FFmpeg documentation: “If in doubt use `-framerate` instead of the input option `-r`.” For some reason `-framerate` isn't documented in this manual here though. – David Foerster Apr 21 '17 at 22:45
  • @DavidFoerster Which `man` page? – llogan Apr 21 '17 at 23:18
  • 1
    That of [`ffmpeg(1)`](http://manpages.ubuntu.com/manpages/zesty/en/man1/ffmpeg.1.html) (Ctrl+F for `-framrate`). There's documentation for it [in the avfoundation input device section](https://ffmpeg.org/ffmpeg-all.html#Options-48) but it doesn't look like it applies to other cases. – David Foerster Apr 22 '17 at 00:27
  • This gives me an error saying "output file #0 does not contain any stream". The input is a raw .h264 file. Any ideas? – Hugo Nov 25 '19 at 15:28
  • @HugoZink Need to see your command and the complete log. You can use a pastebin site. Sharing the h.264 file would be helpful if possible. – llogan Nov 25 '19 at 20:50
  • When the video is played directly in the IP camera app, audio is present, but when the exported .264 file from camera storage is converted using the above command and played in VLC or other video apps there is no sound, any ideas? The conversion log also reads: `video:535kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.255534%` – MotsManish Feb 06 '20 at 06:51
  • @MotsManish `.h264`/`.264` is raw H.264 video: it has no audio. Does the original file as pplayed by the app have audio? Is the audio in a separate file? – llogan Feb 06 '20 at 18:23
  • @llogan, thanks for your comment, Yes, the video when played in camera app has audio and I confirmed in the memory card, the audio file is not separate. – MotsManish Feb 07 '20 at 05:34
  • 1
    @MotsManish I recommend asking a new question. In the question you should provide the complete output of `ffmpeg -i input` where `input` is the file from the camera. – llogan Feb 07 '20 at 18:20
  • Might also need to add `-fps_mode cfr` (I had to in my case). – Dan M. May 12 '23 at 02:40
1

I wrote a simple bash script to convert all the files in a directory. Make sure the directory only contains the source files since the operation will run on all files in a given directory.

touch ./convert
chmod +x ./convert

edit convert

#!/bin/bash
for f in *; do
    if [ -f "$f" ] && [ "$f" != "convert" ]; then
        ffmpeg -framerate 25 -i "$f" -c copy "$f.mp4"
    fi
done

Drop in a directory with only the source files, double click and choose run

This script assumes ffmpeg is set up on you system. Not sure which libs are needed, this is what I installed before running: sudo apt install ffmpeg x264 x265 h264enc mencoder mplayer

Only run it once

1

Try these commands :

sudo apt-get install x264
x264 raw_stream.264 -o playable_video.mp4

Run the MP4 files in VLC

hg8
  • 13,410
  • 12
  • 71
  • 103
Md Shareef
  • 11
  • 1
  • 1
  • 4