Tôi đang cố gắng để chuyển đổi h264 và aac được tạo bằng MediaCodec bằng FFMPEG và cũng sử dụng hỗ trợ RTMP của FFMPEG để gửi tới youtube. Tôi đã tạo hai đường ống và đang viết từ java (android) thông qua WriteableByteChannels. Tôi có thể gửi cho một đường ống tốt (chấp nhận âm thanh rỗng) như sau:Làm cách nào tôi có thể chạy dòng lệnh FFMPEG và chấp nhận nhiều đường ống (video và âm thanh) mà không bị chặn trên đầu vào đầu tiên?
./ffmpeg -f lavfi -i aevalsrc=0 -i "files/camera-test.h264" -acodec aac -vcodec copy -bufsize 512k -f flv "rtmp://a.rtmp.youtube.com/live2/XXXX"
Phát trực tuyến trên YouTube hoạt động hoàn hảo (nhưng tôi không có âm thanh). Sử dụng hai ống này là mệnh lệnh của tôi:
./ffmpeg \
-i "files/camera-test.h264" \
-i "files/audio-test.aac" \
-vcodec copy \
-acodec copy \
-map 0:v:0 -map 1:a:0 \
-f flv "rtmp://a.rtmp.youtube.com/live2/XXXX""
Các ống được tạo ra với mkfifo, và mở từ java như thế này:
pipeWriterVideo = Channels.newChannel(new FileOutputStream(outputFileVideo.toString()));
Trình tự thực hiện (đối với bây giờ trong giai đoạn thử nghiệm của tôi) là sự sáng tạo của các tập tin, bắt đầu ffmpeg (thông qua vỏ adb) và sau đó bắt đầu ghi mở ra các kênh. ffmpeg sẽ ngay lập tức mở luồng h264 và sau đó chờ đợi, vì nó đang đọc từ đường ống, kênh đầu tiên mở (cho video) sẽ chạy thành công. Khi nói đến cố gắng để mở âm thanh theo cùng một cách, nó không thành công vì ffmpeg đã không thực sự bắt đầu đọc từ đường ống. Tôi có thể mở một cửa sổ thiết bị đầu cuối thứ hai và mèo các tập tin âm thanh và ứng dụng của tôi phun ra những gì tôi hy vọng được mã hóa aac, nhưng ffmpeg không thành công, thường chỉ ngồi đó chờ đợi. Đây là kết quả đầu ra dài dòng:
ffmpeg version N-78385-g855d9d2 Copyright (c) 2000-2016 the FFmpeg
developers
built with gcc 4.8 (GCC)
configuration: --prefix=/home/dev/svn/android-ffmpeg-with-rtmp/src/ffmpeg/android/arm
--enable-shared --disable-static --disable-doc --disable-ffplay
--disable-ffprobe --disable-ffserver --disable-symver
--cross-prefix=/home/dev/dev/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
--target-os=linux --arch=arm --enable-cross-compile
--enable-librtmp --enable-pic --enable-decoder=h264
--sysroot=/home/dev/dev/android-ndk-r10e/platforms/android-19/arch-arm
--extra-cflags='-Os -fpic -marm'
--extra-ldflags='-L/home/dev/svn/android-ffmpeg-with-rtmp/src/openssl-android/libs/armeabi '
--extra-ldexeflags=-pie --pkg-config=/usr/bin/pkg-config
libavutil 55. 17.100/55. 17.100
libavcodec 57. 24.102/57. 24.102
libavformat 57. 25.100/57. 25.100
libavdevice 57. 0.101/57. 0.101
libavfilter 6. 31.100/6. 31.100
libswscale 4. 0.100/4. 0.100
libswresample 2. 0.101/2. 0.101
matched as AVOption 'debug' with argument 'verbose'.
Trailing options were found on the commandline.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option async (audio sync method) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input file files/camera-test.h264.
Successfully parsed a group of options.
Opening an input file: files/camera-test.h264.
[file @ 0xb503b100] Setting default whitelist 'file'
Tôi nghĩ rằng nếu tôi chỉ có thể nhận ffmpeg để bắt đầu nghe cả hai đường ống, phần còn lại sẽ hoạt động!
Cảm ơn thời gian của bạn.
EDIT: Tôi đã thực hiện tiến trình bằng cách tách kết nối và mã hóa đường ống âm thanh, nhưng ngay sau khi luồng video đã được truyền qua lỗi trên âm thanh. Tôi bắt đầu một chủ đề riêng biệt để tạo ra WriteableByteChannel cho âm thanh và nó không bao giờ được thông qua việc tạo ra FileOutputStream.
matched as AVOption 'debug' with argument 'verbose'.
Trailing options were found on the commandline.
Finished splitting the commandline.
Parsing a group of options: global .
Successfully parsed a group of options.
Parsing a group of options: input file files/camera-test.h264.
Successfully parsed a group of options.
Opening an input file: files/camera-test.h264.
[file @ 0xb503b100] Setting default whitelist 'file'
[h264 @ 0xb503c400] Format h264 probed with size=2048 and score=51
[h264 @ 0xb503c400] Before avformat_find_stream_info() pos: 0 bytes read:15719 seeks:0
[h264 @ 0xb5027400] Current profile doesn't provide more RBSP data in PPS, skipping
[h264 @ 0xb503c400] max_analyze_duration 5000000 reached at 5000000 microseconds st:0
[h264 @ 0xb503c400] After avformat_find_stream_info() pos: 545242 bytes read:546928 seeks:0 frames:127
Input #0, h264, from 'files/camera-test.h264':
Duration: N/A, bitrate: N/A
Stream #0:0, 127, 1/1200000: Video: h264 (Baseline), 1 reference frame, yuv420p(left), 854x480 (864x480), 1/50, 25 fps, 25 tbr, 1200k tbn, 50 tbc
Successfully opened the file.
Parsing a group of options: input file files/audio-test.aac.
Applying option vcodec (force video codec ('copy' to copy stream)) with argument copy.
Successfully parsed a group of options.
Opening an input file: files/audio-test.aac.
Unknown decoder 'copy'
[AVIOContext @ 0xb5054020] Statistics: 546928 bytes read, 0 seeks
Đây là nơi tôi cố mở ống âm thanh.
new Thread(){
public void run(){
Log.d("Audio", "pre thread");
FileOutputStream fs = null;
try {
fs = new FileOutputStream("/data/data/android.com.android.grafika/files/audio-test.aac");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Log.d("Audio", "made fileoutputstream"); //never hits here
mVideoEncoder.pipeWriterAudio = Channels.newChannel(fs);
Log.d("Audio", "made it past opening audio pipe");
}
}.start();
Cảm ơn.
bạn có cần ghép cặp '-acodec ... -i tên tệp -vcodec -i filename' không? . Cũng trong đầu ra tiết, bạn có thể quấn dòng cấu hình cho mỗi '--option', rất khó đọc. Chúc may mắn. – shellter
Tôi không nghĩ như vậy, tôi đã nhìn thấy nhiều ví dụ với cờ codec ở cuối. Tôi chỉ thử nó và tôi nhận được cùng một đầu ra. Tôi tự hỏi Nếu tôi cần phải thử streaming các kênh âm thanh và video hoàn toàn độc lập (có thể nếu một dòng video hoạt động là hiện tại trên đường ống đầu tiên nó sẽ tiến hành thứ hai ??). Tôi sẽ cố gắng điều chỉnh mã của tôi cho điều này. – Version135b
Vì bạn chưa có bất kỳ phản hồi thực sự nào, tôi sẽ tìm kiếm các trang web cụ thể hơn đối với xử lý âm thanh hoặc thậm chí là ffmpeg cụ thể. Tôi khá chắc chắn có một diễn đàn ffmpeg "chính thức", nơi bạn có thể nhận được một câu trả lời dứt khoát. Cảm ơn bạn đã chỉnh sửa. Chúc may mắn! – shellter