Encode to m4a container with either FFmpeg or avconv
authorAndrew Strong <andrew.david.strong@gmail.com>
Mon, 13 Jul 2015 08:51:22 +0000 (18:51 +1000)
committerAndrew Strong <andrew.david.strong@gmail.com>
Mon, 13 Jul 2015 08:51:22 +0000 (18:51 +1000)
This allows ecoding to Apple Lossless Audio Codec (alac) using the
FFmpeg reverse engineered encoder. This fixes abcde's bug no.1 :

http://abcde.einval.com/bugzilla/show_bug.cgi?id=1

as well as opening the doors to further judicious use of FFmpeg or
avconv from within abcde.

FAQ
abcde
abcde.1
abcde.conf
changelog

diff --git a/FAQ b/FAQ
index 0e94414..b9f42dd 100644 (file)
--- a/FAQ
+++ b/FAQ
@@ -390,7 +390,32 @@ A. Faac uses mp4v2 to create aac files in an m4a or mp4 container. Some
    As of version 2.7 abcde tests the version of faac being used for mp4v2 
    support and then appropriately  places the audio either in .m4a or .aac. 
    Note that tagging is not possible with mpeg-2/ADTS streams in .aac.
+   
+Q. How do I encode to Apple Lossless Audio Codec (alac)?
+A. As of abcde 2.7.1 there are 3 ways to encode to alac: using qaac, refalac
+   or FFmpeg. To use qaac or refalac follow the installation directions here:
+
+   http://www.andrews-corner.org/qaac.html#installation
+
+   and then set your ~/.abcde.conf file as follows:
+
+   AACENCODERSYNTAX=qaac
+   QAAC="$HOME/.wine/drive_c/qaac/qaac.exe"
+   # Or use the Open Source alac encoder with this small hack:
+   # QAAC="$HOME/.wine/drive_c/qaac/refalac.exe"
+   QAACENCOPTS="--alac --threading --verbose"
+   OUTPUTTYPE="m4a"
+
+   To use FFmpeg (or avconv) set your ~/.abcde.conf file as follows:
+
+   AACENCODERSYNTAX=ffmpeg
+   FFMPEG=ffmpeg
+   # Or give the path to avconv instead:
+   # FFMPEG=avconv
+   FFMPEGENCOPTS="-c:a alac"
+   OUTPUTTYPE="m4a"
 
+  And then sit back and enjoy the music :) 
 
 5. USEPIPES
    ========
@@ -432,7 +457,8 @@ A. No :). Keep in mind that every ripper and encoder differs from in each
 
    Rippers:  cdparanoia, debug, libcdio, cdda2wav, flac, pird.
    Encoders: mp3enc, lame, bladeenc, oggenc, opusenc, flac, speexenc,
-             mpcenc, wavpack, faac, neroAacEnc, fdkaac, qaac, fhgaacenc.
+             mpcenc, wavpack, faac, neroAacEnc, fdkaac, qaac, fhgaacenc,
+             ffmpeg.
 
 Q. Can I add a ripper or encoder which is not supported?
 A. Sure! If you plan to use a ripper or encoder which is not supported you
diff --git a/abcde b/abcde
index 6532ace..d6e8d48 100755 (executable)
--- a/abcde
+++ b/abcde
@@ -1000,6 +1000,9 @@ do_tag ()
                                        --artist="$TRACKARTIST" --album="$DALBUM" --title="$TRACKNAME" --tracknum=${TRACKNUM:-$1} \
                                        --year="$CDYEAR" --genre="$CDGENRE" --comment="$COMMENT" $ATOMICPARSLEYOPTS --overWrite
                                        ;;
+                               ffmpeg)
+                                       run_command tagtrack-$OUTPUT-$1 true   
+                               ;;
                        esac
                        ;;
                wav)
@@ -1274,6 +1277,15 @@ do_encode ()
                                        fhgaacenc)
                                                $RUN_COMMAND nice $EFFECTIVE_NICE $WINE $AACENCODER $AACENCODEROPTS "$IN" "$OUT"
                                                ;;
+                                       ffmpeg)
+                                               if [ "$DOTAG" = "y" ]; then
+                                                       $RUN_COMMAND nice $EFFECTIVE_NICE $AACENCODER -i "$IN" $AACENCODEROPTS -metadata artist="$TRACKARTIST" \
+                                                       -metadata album="$DALBUM" -metadata title="$TRACKNAME" -metadata track=${TRACKNUM:-$1} -metadata date="$CDYEAR" \
+                                                       -metadata genre="$CDGENRE" -metadata comment="$COMMENT" "$OUT" 
+                                               else 
+                                                       $RUN_COMMAND nice $EFFECTIVE_NICE -i "$IN" $AACENCODER $AACENCODEROPTS "$OUT"
+                                               fi
+                                               ;;
                                        esac
                                ;;
                        wav)
@@ -3457,6 +3469,8 @@ FDKAAC=fdkaac
 # detailed notes in the sample abcde.conf file in the abcde tarball.
 QAAC=qaac
 FHGAACENC=fhgaacenc
+# The path to 'avconv' rather than 'ffmpeg'can be used here:
+FFMPEG=ffmpeg
 
 ID3=id3
 ID3V2=id3v2
@@ -3538,6 +3552,7 @@ NEROACENCOPTS=
 FDKAACENCOPTS='--bitrate 192k'
 QAACENCOPTS=
 FHGAACENCOPTS=
+FFMPEGENCOPTS=
 
 ID3OPTS=
 EYED3OPTS=""
@@ -4111,6 +4126,7 @@ do
                        [ "$AACENCODERSYNTAX" = "neroAacEnc" ] && NEEDNEROAACTAG=y
                        [ "$AACENCODERSYNTAX" = "qaac" ] && NEEDWINE=y
                        [ "$AACENCODERSYNTAX" = "fhgaacenc" ] && NEEDWINE=y && NEEDATOMICPARSLEY=y
+                       [ "$AACENCODERSYNTAX" = "ffmpeg" ] &&  [ "$DOTAG" = "y" ]
                        ;;
                wav)
                        if [ "$KEEPWAVS" = "y" ]; then
@@ -4262,6 +4278,15 @@ case "$AACENCODERSYNTAX" in
                        AACENCODER="$FHGAACENC"
                fi
                ;;
+       ffmpeg)
+               if [ -z "$FFMPEGENCOPTS" ] && [ -n "$AACENCOPTS" ]; then
+                       AACENCODEROPTS="${AACENCODEROPTSCLI:-$AACENCOPTS}"
+                       AACENCODER="$FFMPEG"
+               else
+                       AACENCODEROPTS="${AACENCODEROPTSCLI:-$FFMPEGENCOPTS}"
+                       AACENCODER="$FFMPEG"
+               fi
+               ;;
 esac
 
 # and which tagger
@@ -4404,6 +4429,7 @@ PIPE_wavpack="-"
 PIPE_faac="-"
 PIPE_qaac="-"
 PIPE_fhgaacenc="-"
+PIPE_ffmpeg="-"
 # Both neroAacEnc and fdkaac seem to manage without the addition of
 # the 'ignorelength' option in PIPE_$AACENCODERSYNTAX when piping
 # in this manner.                                           Andrew.
diff --git a/abcde.1 b/abcde.1
index 953ddad..4d302b4 100644 (file)
--- a/abcde.1
+++ b/abcde.1
@@ -329,10 +329,10 @@ point we only have \'mpcenc\' available, from musepack.net.
 .TP
 .B AACENCODERSYNTAX
 Specifies the style of encoder to use for M4A (AAC) encoder. We support \'faac\'
-as \'default\' as well as higher quality audio with neroAacEnc, fdkaac, qaac and fhgaacenc.
-If qaac or the Open Source refalac are used it is also possible to generate Apple
-Lossless Audio Codec (alac) files. Note that qaac, refalac and fhgaacenc are Windows applications
-which require Wine to be installed.
+as \'default\' as well as higher quality audio with neroAacEnc, fdkaac, qaac,fhgaacenc
+and FFmpeg or avconv. If qaac, refalac or FFmpeg / avconv are used it is also possible
+to generate Apple Lossless Audio Codec (alac) files. Note that qaac, refalac and fhgaacenc
+are Windows applications which require Wine to be installed.
 .TP
 .B WVENCODERSYNTAX
 Specifies the style of encoder to use for WavPack. We support \'wavpack\'
@@ -386,7 +386,7 @@ VORBIZE, OGGENC, FLAC, SPEEXENC, MPCENC, WVENC, APENC, OPUSENC, ID3, EYED3,
 METAFLAC, CDPARANOIA, CD_PARANOIA, CDDA2WAV, PIRD, CDDAFS, CDDISCID, CDDBTOOL, 
 EJECT, MD5SUM, DISTMP3, VORBISCOMMENT, NORMALIZE, CDSPEED, MP3GAIN, VORBISGAIN, 
 MPCGAIN, MKCUE, MKTOC, CUE2DISCID (see option "\-X"), DIFF, HTTPGET, GLYRC,
-IDENTIFY, DISPLAYCMD, CONVERT, QAAC, WINE, FHGAACENC and ATOMICPARSLEY.
+IDENTIFY, DISPLAYCMD, CONVERT, QAAC, WINE, FHGAACENC, ATOMICPARSLEY and FFMPEG.
 .TP
 .B COMMAND-LINE OPTIONS
 If you wish to specify command-line options to any of the programs \fBabcde\fR uses,
@@ -396,8 +396,8 @@ OGGENCOPTS, FLACOPTS, SPEEXENCOPTS, MPCENCOPTS, FAACENCOPTS, NEROAACENCOPTS, FDK
 OPUSENCOPTS, ID3OPTS, EYED3OPTS, MP3GAINOPTS, CDPARANOIAOPTS, CDDA2WAVOPTS, PIRDOPTS, 
 CDDAFSOPTS, CDDBTOOLOPTS, EJECTOPTS, DISTMP3OPTS, NORMALIZEOPTS, CDSPEEDOPTS, MKCUEOPTS, 
 VORBISCOMMMENTOPTS, METAFLACOPTS, DIFFOPTS, FLACGAINOPTS, VORBISGAINOPTS, HTTPGETOPTS,
-GLYRCOPTS, IDENTIFYOPTS, CONVERTOPTS, DISPLAYCMDOPTS, QAACENCOPTS, FHGAACENCOPTS and
-ATOMICPARSLEYOPTS.
+GLYRCOPTS, IDENTIFYOPTS, CONVERTOPTS, DISPLAYCMDOPTS, QAACENCOPTS, FHGAACENCOPTS,
+ATOMICPARSLEYOPTS and FFMPEGENCOPTS.
 .TP
 .B CDSPEEDVALUE
 Set the value of the CDROM speed. The default is to read the disc as fast as
@@ -428,7 +428,7 @@ over 100MB for a machine that can encode music as fast as it can read it).
 Specifies the encoding format to output, as well as the default extension and
 encoder. Defaults to "vorbis". Valid settings are "vorbis" (or "ogg")
 (Ogg/Vorbis), "mp3" (MPEG-1 Audio Layer III), "flac" (Free Lossless Audio
-Codec), "spx" (Ogg/Speex), "mpc" (MPP/MP+ (Musepack)), "m4a" (AAC)),
+Codec), "spx" (Ogg/Speex), "mpc" (MPP/MP+ (Musepack), "m4a" (AAC or ALAC),
 "wv" (WavPack", "wav" (Microsoft Waveform) or "opus" (Opus Interactive Audio Codec). Values
 like "vorbis,mp3" encode the tracks in both Ogg/Vorbis and MP3 formats. For example
 .br
index 8c76f08..1f4ed67 100644 (file)
@@ -64,7 +64,7 @@
 # mpcenc - encoder for MPCENCODERSYNTAX
 # wavpack - encoder for WVENCODERSYNTAX
 # mac - for APENCODERSYNTAX
-# faac, neroAacEnc, fdkaac, qaac, fhgaacenc - for AACENCODERSYNTAX
+# faac, neroAacEnc, fdkaac, qaac, fhgaacenc, ffmpeg - for AACENCODERSYNTAX
 # opusenc - for OPUSENCODERSYNTAX
 # default is a valid option for oggenc, lame, flac, speexenc, mpcenc, wavpack, faac and opus.
 # Currently this affects the default location of the binary, the variable
 #NEROAACENC=neroAacEnc
 #FDKAAC=fdkaac
 #OPUSENC=opusenc
+# Note that if you use avconv rather than FFmpeg give the
+# path to avconv here:
+# FFMPEG=ffmpeg
 
 # The path for qaac, refalac and fhgaacenc  can be problematic as abcde
 # cannot cope with the 'standard' Wine location with spaces. For example:
 #APENCOPTS='-c4000'
 
 # M4A/AAC
-# There are now 5 AAC encoders available to abcde :).
+# There are now 5 AAC encoders available to abcde :). FFmpeg
+# is also available for the m4a container...
 # Note that the old AACENCOPTS has been rendered obsolete by
 # the following options, new to abcde 2.7:
 #  1. faac: see 'faac --long-help' and consider
 #     consider using '--vbr 4' for a decent quality encode.
 #FHGAACENCOPTS=
 
+#FFMPEGENCOPTS=
+
 # OPUS
 # For the encoder options look at: 'opusenc -h'
 #OPUSENCOPTS=
index b5cc78c..9993db2 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,16 +1,14 @@
 abcde 2.7.1
 
+  * Encoding to m4a container with FFmpeg or avconv. This allows
+    for alac encoding with FFmpeg's reverse engineered alac encoder.
   * AAC encoding with fhgaacenc via Wine. Tagging is provided
     by AtomicParsley which has been added back to abcde :). This
     allows encoding with HE-AAC v2, unavailable with qaac.
   * Support added for AAC encoding with qaac via Wine. This
-    also allows for Apple Lossless Audio Coding (alac) when
-    using:
-
-     QAACENCOPTS="--alac"
-
-    This closes Issue 142, thanks to Bernd Fischer-Krellenberg
-    for the enhancement request.
+    also allows for Apple Lossless Audio Coding (alac) using
+    either qaac or refalac. This closes Issue 142, thanks to
+    Bernd Fischer-Krellenberg for the enhancement request.
 
 abcde 2.7