源地址:http://lukasz.cepowski.com/devlog/30,iphone-m3u8-segmenter-from-ffmpeg-for-video-streaming
Recent versions of ffmpeg contains a m3u8 segmenter feature which can be used for remuxing video files for streaming over http and watching video on iphone.
Segmenter feature usage for iphone
Let's say that there is some .ts media file encoded with mpegts codec and we want to segment it for streaming over http. Segmenting is a process where one media container is being converted into set of smaller files with different quality to adjust the current quality to the bandwidth between streaming server and the display, iphone in this case. Segmenter will produce a set of smaller .ts files and a "playlist" .m3u8 which contains urls of the .ts files.
To process media by ffmpeg builtin segmenter run:
ffmpeg -re -i source.ts -codec copy -map 0 -f segment -segment_list foo.m3u8 -segment_list_flags +live -segment_time 10 out%03d.ts
It will produce .m3u8 playlist and .ts files with segments.
Note that this command will not transcode the video, it will just split data. Source .ts file should be encoded with mpegts codec in order to play it on iphone.
Compile static version of ffmpeg
Following steps are required to build stable static version of ffmpeg-1.0. Tested on debian i386 and amd64.
Based on https://github.com/stvs/ffmpeg-static
Install compiler and essential packages
apt-get -y install build-essential pkg-config bzip2
Create build and target directories
BUILD_DIR="/home/user/build"; export BUILD_DIR
TARGET_DIR="/home/user/target"; export TARGET_DIR
mkdir -p $BUILD_DIR
mkdir -p $TARGET_DIR
yasm
cd $BUILD_DIR
wget "http://mirror.hellworx.com/yasm/yasm-1.2.0.tar.gz"
tar zxvf yasm-1.2.0.tar.gz
cd yasm-1.2.0
./configure --prefix=$TARGET_DIR
make -j 4
make install
zlib
cd $BUILD_DIR
wget "http://mirror.hellworx.com/zlib/zlib-1.2.7.tar.bz2"
tar jxvf zlib-1.2.7.tar.bz2
cd zlib-1.2.7
./configure --prefix=$TARGET_DIR
make -j 4
make install
bzip2
cd $BUILD_DIR
wget "http://mirror.hellworx.com/bzip2/bzip2-1.0.6.tar.gz"
tar zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make install PREFIX=$TARGET_DIR
libpng
cd $BUILD_DIR
wget "http://mirror.hellworx.com/libpng/libpng-1.2.50.tar.gz"
tar zxvf libpng-1.2.50.tar.gz
cd libpng-1.2.50
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
make -j 4
make install
make -j 4
make install
libogg
cd $BUILD_DIR
wget "http://mirror.hellworx.com/libogg/libogg-1.3.0.tar.gz"
tar zxvf libogg-1.3.0.tar.gz
cd libogg-1.3.0
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
make -j 4
make install
libvorbis
cd $BUILD_DIR
wget "http://mirror.hellworx.com/libvorbis/libvorbis-1.3.3.tar.gz"
tar zxvf libvorbis-1.3.3.tar.gz
cd libvorbis-1.3.3
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
make -j 4
make install
libtheora
cd $BUILD_DIR
wget "http://mirror.hellworx.com/libtheora/libtheora-1.1.1.tar.bz2"
tar jxvf libtheora-1.1.1.tar.bz2
cd libtheora-1.1.1
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
make -j 4
make install
libvpx
cd $BUILD_DIR
wget "http://mirror.hellworx.com/libvpx/libvpx-v1.0.0.tar.bz2"
tar jxvf libvpx-v1.0.0.tar.bz2
cd libvpx-v1.0.0
PATH="$TARGET_DIR/bin:$PATH" CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
PATH="$TARGET_DIR/bin:$PATH" make -j 4
PATH="$TARGET_DIR/bin:$PATH" make install
faac
cd $BUILD_DIR
wget "http://mirror.hellworx.com/faac/faac-1.28.tar.bz2"
tar jxvf faac-1.28.tar.bz2
cd faac-1.28
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
sed -i -e "s|^char \*strcasestr.*|//\0|" common/mp4v2/mpeg4ip.h
make -j 4
make install
x264
cd $BUILD_DIR
wget "http://mirror.hellworx.com/x264/x264-snapshot-20120425-2245.tar.bz2"
tar jxvf x264-snapshot-20120425-2245.tar.bz2
cd x264-snapshot-20120425-2245
PATH="$TARGET_DIR/bin:$PATH" CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static
PATH="$TARGET_DIR/bin:$PATH" make -j 4
PATH="$TARGET_DIR/bin:$PATH" make install
xvidcore
cd $BUILD_DIR
wget "http://mirror.hellworx.com/xvidcore/xvidcore-1.3.2.tar.gz"
tar zxvf xvidcore-1.3.2.tar.gz
cd xvidcore/build/generic
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
make -j 4
make install
lame
cd $BUILD_DIR
wget "http://mirror.hellworx.com/lame/lame-3.99.5.tar.gz"
tar zxvf lame-3.99.5.tar.gz
cd lame-3.99.5
CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --enable-static --disable-shared
make -j 4
make install
remove shared objects
cd $TARGET_DIR/lib
rm -f *.dylib*
rm -f *.so*
ffmpeg
cd $BUILD_DIR
wget "http://mirror.hellworx.com/ffmpeg/ffmpeg-1.0.tar.gz"
tar zxvf ffmpeg-1.0.tar.gz
cd ffmpeg-1.0
PATH="$TARGET_DIR/bin:$PATH" CFLAGS="-I$TARGET_DIR/include" LDFLAGS="-L$TARGET_DIR/lib -lm" ./configure --prefix=$TARGET_DIR --extra-version=static --disable-debug --disable-shared --enable-static --extra-cflags=--static --disable-ffplay --disable-ffserver --disable-doc --enable-gpl --enable-pthreads --enable-postproc --enable-gray --enable-runtime-cpudetect --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-bzlib --enable-zlib --enable-nonfree --enable-version3 --enable-libvpx --disable-devices
PATH="$TARGET_DIR/bin:$PATH" make -j 4
PATH="$TARGET_DIR/bin:$PATH" make install
Download static ffmpeg
You can download static builds of ffmpeg from here:
debian6-i386: http://mirror.hellworx.com/ffmpeg/ffmpeg-static/i386/ffmpeg.bin
debian6-amd64: http://mirror.hellworx.com/ffmpeg/ffmpeg-static/amd64/ffmpeg.bin