我正在开发一个Android应用程序。我的要求是在android上实现rtsp流服务器。它必须使用MediaRecorder
直播视频和音频。另一个要求是我必须使用live555作为流媒体服务器。我从MediaRecorder
获得的是MP4或3GP格式。 live555无法同时传输。但如果我只以“RAW_AMR”格式录制音频,它可以传输音频。由于live555支持'mpg'格式的流媒体,我决定让一个中间人可以将'mp4'或'3gp'转换为'mpg',我选择了ffmpeg。
我已经将live555和ffmpeg移植到了android。 ffmpeg能够转换MediaRecorder
完成后记录的文件。但问题是ffmpeg无法同时执行此操作。也就是说,ffmpeg无法在录制时转换文件。它显示Operation not permitted
错误。我在我的linux机器上尝试了相同的操作,使用VLC在android上记录而不是MediaRecorder
。结果是一样的。 ffmpeg能够在录制完成后进行转换,并且在录制时无法执行相同操作。
这是我在linux盒子上发出的ffmpeg命令:
ffmpeg -v 9 -loglevel 99 -i test.mp4 test.mpg
test.mp4
是VLC以mp4
格式录制的文件。并且test.mpg
是我的目标文件。以下是ffmpeg在终端上的输出。
ffmpeg version 0.8.9, Copyright (c) 2000-2011 the FFmpeg developers
built on Feb 1 2012 18:29:27 with gcc 4.6.2 20111027 (Red Hat 4.6.2-1)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --enable-bzlib --enable-libcelt --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 8. 0 / 53. 8. 0
libavformat 53. 5. 0 / 53. 5. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 2. 0. 0 / 2. 0. 0
libpostproc 51. 2. 0 / 51. 2. 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1672600] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1672600] ISO: File Type Major Brand: isom
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1672600] moov atom not found
test.mp4: Operation not permitted
有人请告诉我导致问题的原因是什么?或者ffmpeg可以实现上述场景。也就是说,ffmpeg是否能够在录制的同时进行转换?如果ffmpeg无法做到,请您建议任何其他解决方案吗?
注意:我正在添加一个C
标签,因为如果可以通过ffmpeg中的C进行一些调整,我已经准备好了(我希望解决方案非常糟糕)。但请提供正确方向的一些指示。
答案 0 :(得分:2)
3gp
和mp4
格式都包含在文件完成时写入的moov atom(数据块)。在此之前,文件不完整。
您可以使用FLV
作为“中间”格式。也可以使用支持实时流式传输的其他格式。如果需要,选项-re
可能有助于告诉编码器以流速率运行。
另见Is it possible to play an output video file from an encoder as it's being encoded?。