[mythtvnz] Cutting H.264 DVB-T files with ffmpeg without transcoding
Stephen Worthington
stephen_agent at jsw.gen.nz
Mon Jul 19 06:29:33 BST 2010
On Mon, 19 Jul 2010 16:46:02 +1200, you wrote:
>Craig Blaikie wrote:
>> Jonathan Hoskin wrote:
>>> Anybody worked out a reliable way to cut recordings from Freeview
>>> terrestrial using ffmpeg?
>>>
>>>
>>> Nope. I wonder if the developers have properly addressed it / been made
>>> aware of it.
>>>
>>>
>>>
>>> I've seen a lot of posts from (I think) ffmpeg devs on various lists
>>> which seem to say "too bad, it's the recording that's bad, not a bug in
>>> ffmpeg".
>>>
>>> ffmpeg -async 1 -ss [start time] -t [duration] -i recording.mpg
>> -vcodec
>>> copy -acodec ac3 -ab 384k -f dvd cut_recording.mpg
>>>
>>> The "-async 1" seems to be needed to keep audio in sync with video.
>> The
>>> "-f dvd" might (not sure yet) be a fix for av mux errors. Audio is
>>> transcoded to AC3 since most channels only have LATM AAC audio.
>>>
>>>
>>> "-f dvd" uses a MPEG2-PS container - H.264 isn't supported in the
>>> MPEG-PS file format:
>>> http://www.gossamer-threads.com/lists/mythtv/mythtvnz/417130#417130
>>
>>
>> David Moore wrote
>>> Thanks for that. I have tried MPEG-TS format as well but also with no
>>> joy. Latest semi-successful attempts have involved extracting the video
>>> to raw H264 format and transcoding the audio to raw AC3 then remuxing to
>>> mpg (without the -f dvd option). Unfortunately I get audio/video sync
>>> problems now. I don't see how I can easily resolve this because (I
>>> assume) the raw formats have no timestamps or have timestamps which are
>>> slightly out of sync.
>>>
>>> Seems that timestamps may be the root of the problem because I was
>>> previously getting the ffmpeg "non-monotone timestamp" error and weird
>>> start times reported by ffmpeg. I have no idea how to fix this without a
>>> lot of manual audio/video syncing. I wonder how myth copes with the same
>>> recordings when ffmpeg has problems? Might have to dig into the myth and
>>> ffmpeg source code to try and find the differences.
>>
>> You could try using vlc, as I found it was able to play the recorded video
>> files with sound, use it to convert the audio to mp4a and then use ffmpeg to
>> do the cutting or compression, I know it's an extra step, and you end
>> needing free space to have an almost identical copy of the file there, but
>> it seems to work, and the audio appears to stay in sync. I couldn't get VLC
>> to cut and convert the video without totally messing it up, hence the extra
>> ffmpeg step.
>>
>> Use command line version of VLC to copy video and transcode audio.
>>
>> nice -n 15 cvlc input_filename.mpg --sout="#transcode{acodec=mp4a, ab=192,
>> channels=2, samplerate=48000}:standard{mux=ts, dst=temp_filename.mp4,
>> access=file}:sout-transcode-soverlay=0" vlc://quit
>>
>> then use ffmpeg to cut, or in this example, convert to iPod.
>>
>> nice -n 15 ffmpeg -i temp_filename.mp4 -vcodec libxvid -b 512kb -qmin 3
>> -qmax 5 -bufsize 4096 -g 300 -acodec libfaac -ab 192kb -s 736x416 -aspect
>> 16:9 output_filename.mp4
>>
>> Cheers,
>> Craig
>>
>
>Thanks Craig. Your advice about using VLC helped a lot. I still took a
>while to fully solve my problems though. What I wanted to do was snip
>about 15 mins off the end of one recording and then join it to another
>recording. Here is what I did:
>
>
>Step 1: Transcode the whole of the first file with VLC:
>
>cvlc 2 file1.mpg :sout="#transcode{acodec=a52, ab=384, channels=2,
>samplerate=48000}:standard{mux=ps, dst=file1a.mpg,
>access=file}:sout-transcode-soverlay=0" vlc://quit
>
>Step 2: Snip the end off the transcoded file with ffmpeg:
>
>ffmpeg -async 1 -ss 01:55:17 -i file1a.mpg -vcodec copy -acodec copy
>file1b.mpg
>
>Step 3: Transcode the second file with VLC:
>
>cvlc file2.mpg --sout="#transcode{acodec=a52, ab=384, channels=2,
>samplerate=48000}:standard{mux=ps, dst=file2a.mpg,
>access=file}:sout-transcode-soverlay=0" vlc://quit
>
>Step 4: Fix the timestamps in file2a so that they start just after the
>end of file1b. (Before I did this ffmpeg reported a start time of around
>8800 seconds for file2a!? I've seen this sort of thing on lots of my
>recordings.)
>
>ffmpeg -itsoffset 881.58 -i file2a.mpg -vcodec copy -acodec copy file2b.mpg
>
>Step 5: Cat the two files into the final product:
>
>cat file1b.mpg file2b.mpg > final_file.mpg
>
>
>This may not be the most efficient way to get what I wanted but the end
>result looks good with only a minor glitch at the join, good audio/video
>sync and is seekable.
>
>I found the vlc "mux=ps" option to be a lot faster than "mux=ts".
>
>The ffmpeg "itsoffset" option didn't work as I expected. It seems to
>need an absolute time, not an offset time. The value I entered ended up
>as the value for the start time of the second file. This value was the
>length of the first file so "catting" the files together ended up with
>good timestamps in the final file, if you follow what I'm trying to say.
>
>I'm still pretty sure that most of my problems are due to bad
>timestamps. Need to do more tests to find a final solution.
Just using cat to join those files is not valid. There are headers on
the front of each file .mpg file. So you will probably get a playback
glitch when the second set headers gets read as bad data.
More information about the mythtvnz
mailing list